Bcellmagic analysis pipeline

Pipeline overview

Number of sequences

Number of reads for each of the samples and number of sequences left after representative analysis steps.

ID Source Treatment Extraction_time Population Sequences_R1 Sequences_R2 Filtered_quality_R1 Filtered_quality_R2 Mask_primers_R1 Mask_primers_R2 Paired Build_consensus Assemble_pairs Unique Representative_2 Igblast
QMKMK229AC CLAD1 Cladribin baseline DN 1001901 1001901 998230 929323 950964 889152 874759 523734 90354 59291 8472 6790
QMKMK230AF CLAD1 Cladribin baseline N 601885 601885 599360 566181 571750 543140 533806 402067 97531 92697 6385 4471
QMKMK231AN CLAD1 Cladribin baseline M 1036290 1036290 1033363 964197 980082 919636 904197 780525 135765 124169 4958 4670
QMKMK232AV CLAD1 Cladribin baseline P 1352414 1352414 1346800 1262235 1290104 1212304 1196447 939220 149863 130713 7714 6760
QMKMK233A5 CLAD1 Cladribin 6months DN 1223690 1223690 1218476 1135468 1160160 1085218 1067347 791259 164348 121167 12720 11196
QMKMK234AD CLAD1 Cladribin 6months N 577697 577697 574852 539847 539088 508859 500228 385783 89643 88089 4824 3042
QMKMK235AL CLAD1 Cladribin 6months M 801072 801072 799337 750714 761523 718534 706606 608542 111207 95243 4519 4087
QMKMK236AT CLAD1 Cladribin 6months P 2043123 2043123 2033938 1877437 1930800 1784871 1761332 1235843 181414 160573 15491 13605
QMKMK241AU CLAD1 Cladribin 12months DN 1857453 1857453 1847028 1701105 1709731 1569714 1550126 857641 153794 117452 14305 11726
QMKMK242A4 CLAD1 Cladribin 12months M 1850771 1850771 1846857 1708178 1770918 1632432 1611884 1280996 217155 195288 10505 7909
QMKMK243AC CLAD1 Cladribin 12months N 1244736 1244736 1242282 1135476 1178264 1075176 1059637 679941 139275 136730 15410 4897
QMKMK244AK CLAD1 Cladribin 12months P 1811754 1811754 1807946 1664568 1739221 1597527 1577659 1079483 254309 209762 21112 17524
QMKMK533AN CLAD2 Cladribin baseline N 299299 299299 298776 284644 278650 263896 259773 136538 42888 21024 3065 2478
QMKMK534AV CLAD2 Cladribin baseline M 911354 911354 909208 856360 853308 802774 789542 619034 99507 87314 6089 5676
QMKMK535A5 CLAD2 Cladribin baseline DN 1548122 1548122 1546518 1485086 1455661 1392202 1373849 746018 162419 91821 14291 12022
QMKMK536AD CLAD2 Cladribin baseline P 828075 828075 826764 781959 769833 729669 715212 583392 116702 101158 7315 7063
QMKMK537AL CLAD2 Cladribin 6months N 1695948 1695948 1695010 1636672 1564060 1506398 1482971 541495 162342 145708 25035 10021
QMKMK538AT CLAD2 Cladribin 6months M 2467900 2467900 2466808 2356982 2309769 2200497 2169463 767599 187812 126230 19934 17409
QMKMK539A3 CLAD2 Cladribin 6months DN 1670407 1670407 1669498 1608729 1548656 1486886 1464870 472354 119636 57322 9889 8396
QMKMK540A6 CLAD2 Cladribin 6months P 1418658 1418658 1417830 1366294 1320682 1272534 1251506 771396 206754 144573 18117 16226
QMKMK541AE CLAD2 Cladribin 12months N 1254799 1254799 1253722 1212466 1174117 1107772 1090535 522116 180331 174806 16654 7429
QMKMK542AM CLAD2 Cladribin 12months M 2480119 2480119 2478403 2372338 2315848 2199929 2166193 1126337 265733 232685 15947 13290
QMKMK543AU CLAD2 Cladribin 12months DN 1492340 1492340 1491521 1430650 1373414 1309222 1288903 743614 187692 140124 15720 12862
QMKMK544A4 CLAD2 Cladribin 12months P 1104002 1104002 1103382 1063497 1036043 994570 979051 493550 147756 93526 13523 11414
QMKMK545AC CLAD3 Cladribin baseline N 1571620 1571620 1570771 1523584 1497824 1451341 1431781 543127 171669 143577 26458 14092
QMKMK546AK CLAD3 Cladribin baseline M 1798031 1798031 1796794 1739586 1712984 1656005 1636655 1007055 254908 229383 13572 12353
QMKMK547AS CLAD3 Cladribin baseline DN 1325826 1325826 1324051 1277183 1262297 1218805 1199399 629789 146170 105948 13939 11562
QMKMK548A2 CLAD3 Cladribin baseline P 1375460 1375460 1374152 1327752 1308934 1264258 1245115 730531 161034 141145 13243 12400
QMKMK549AA CLAD3 Cladribin 6months N 1385899 1385899 1385012 1335147 1305595 1255991 1239376 490511 158561 140713 30701 13136
QMKMK550AD CLAD3 Cladribin 6months M 1240876 1240876 1240142 1207393 1183864 1149887 1136654 681735 204620 143599 17407 15520
QMKMK551AL CLAD3 Cladribin 6months DN 261349 261349 260058 244972 215326 231145 197023 176276 32325 19157 2454 1429
QMKMK552AT CLAD3 Cladribin 6months P 235034 235034 234857 229626 224030 219497 216216 172573 77444 53394 7446 7258
QMKMK553A3 CLAD3 Cladribin 12months N 1591756 1591756 1590676 1540766 1517741 1464383 1445065 515307 173696 149077 28654 15266
QMKMK554AB CLAD3 Cladribin 12months M 1564019 1564019 1562831 1507023 1492048 1428178 1411785 779001 213213 166219 19733 15266
QMKMK555AJ CLAD3 Cladribin 12months DN 111483 111483 111312 107140 103242 100959 97245 85541 42105 30219 5062 4850
QMKMK556AR CLAD3 Cladribin 12months P 155013 155013 154892 151406 146876 144291 141167 87747 48027 25315 4504 4231
QMKMK557A1 CLAD4 Cladribin baseline N 1398965 1398965 1392433 1294121 1330529 1238996 1220960 745812 129060 123160 9747 4513
QMKMK558A9 CLAD4 Cladribin baseline M 1374928 1374928 1368571 1237182 1305056 1178785 1164891 979676 141173 122743 6397 5864
QMKMK559AH CLAD4 Cladribin baseline DN 2409179 2409179 2398262 2172405 2301729 2083291 2058484 1124304 196878 154809 19618 16839
QMKMK560AK CLAD4 Cladribin baseline P 1068173 1068173 1064298 978142 1021878 940132 928637 709473 170030 146347 9104 8545
QMKMK561AS CLAD4 Cladribin 6months N 1641107 1641107 1576042 1345005 1477248 1274519 1229456 874314 68880 67173 2444 132
QMKMK562A2 CLAD4 Cladribin 6months M 1385399 1385399 1379705 1250203 1320361 1196503 1179563 962386 157538 143239 7102 6064
QMKMK563AA CLAD4 Cladribin 6months DN 2589345 2589345 2576384 2318103 2466634 2218225 2186658 1244923 195806 163852 20595 16888
QMKMK564AI CLAD4 Cladribin 6months P 1801823 1801823 1794104 1626149 1707738 1549822 1527755 970293 139581 117108 10526 9214
QMKMK565AQ CLAD4 Cladribin 12months N 1233912 1233912 1227233 1127439 1171418 1074382 1058954 706032 124861 119933 8175 4157
QMKMK566A0 CLAD4 Cladribin 12months M 1519136 1519136 1511801 1377911 1458300 1325813 1307238 1038900 165094 139607 10053 9030
QMKMK567A8 CLAD4 Cladribin 12months DN 1084835 1084835 1077309 963006 985191 874572 862952 641429 113514 106906 8242 4475
QMKMK568AG CLAD4 Cladribin 12months P 1322433 1322433 1317876 1210528 1271272 1164834 1150760 665756 151153 105442 9341 7208
QMKMK569AO CLAD5 Cladribin baseline N 1447197 1447197 1445335 1373651 1337298 1269719 1252608 619522 174482 158367 18757 6710
QMKMK570AR CLAD5 Cladribin baseline M 1468661 1468661 1466765 1367672 1319151 1225178 1209652 893529 189690 167978 7970 6680
QMKMK571A1 CLAD5 Cladribin baseline DN 1126741 1126741 1125031 1062795 1031127 971370 960077 512019 112116 70502 9251 6405
QMKMK572A9 CLAD5 Cladribin baseline P 1397460 1397460 1396014 1316108 1290285 1214297 1199625 843530 178333 134207 12210 10853
QMKMK573AH CLAD5 Cladribin 6months N 1329042 1329042 1326871 1258667 1193608 1129648 1114054 535460 159471 147244 17033 5721
QMKMK574AP CLAD5 Cladribin 6months M 1237833 1237833 1236499 1162554 1137697 1066878 1053987 813652 164645 137354 6905 6396
QMKMK575AX CLAD5 Cladribin 6months DN 1383178 1383178 1381643 1296415 1266158 1181512 1167639 852502 190750 173985 7869 5721
QMKMK576A7 CLAD5 Cladribin 6months P 1262705 1262705 1261244 1179067 1143706 1064972 1051693 793719 206575 171238 10789 9636
QMKMK577AF CLAD5 Cladribin 12months N 1351967 1351967 1350771 1280959 1243575 1172545 1156655 527191 156413 144948 15828 5310
QMKMK578AN CLAD5 Cladribin 12months M 713600 713600 712818 676328 667632 628686 622159 517446 126346 101975 4161 3828
QMKMK579AV CLAD5 Cladribin 12months DN 2456014 2456014 2451084 2269903 2141182 1958202 1938322 660015 132912 86965 14241 11745
QMKMK580A0 CLAD5 Cladribin 12months P 834969 834969 834181 787283 779041 731399 722664 580598 147105 115414 6571 6142
QMKMK581A8 CLAD6 Cladribin baseline N 1001206 1001206 1000860 970356 962940 936587 920818 443222 140232 86145 18839 12881
QMKMK582AG CLAD6 Cladribin baseline M 1283684 1283684 1283183 1244329 1236314 1203407 1184237 788065 169359 149750 15320 14342
QMKMK583AO CLAD6 Cladribin baseline DN 1097528 1097528 1096978 1066751 1063618 1033309 1021656 634966 162233 105871 17897 16466
QMKMK584AW CLAD6 Cladribin baseline P 1016627 1016627 1016172 988801 984990 962146 947239 442682 163962 76800 20099 18856
QMKMK585A6 CLAD6 Cladribin 6months N 1285504 1285504 1285176 1251705 1229806 1201931 1182778 543799 171992 148549 28207 18306
QMKMK586AE CLAD6 Cladribin 6months M 1330009 1330009 1329416 1292399 1284875 1253526 1233148 891220 225136 195466 18430 16976
QMKMK587AM CLAD6 Cladribin 6months DN 1242825 1242825 1240467 1197808 1200344 1156147 1137148 654641 192546 126256 26229 24526
QMKMK588AU CLAD6 Cladribin 6months P 1002045 1002045 1001430 967754 965269 932794 921632 434169 147302 84076 18894 16986
QMKMK589A4 CLAD6 Cladribin 12months N 1137999 1137999 1137344 1103323 1097509 1066778 1049119 462125 140904 135519 21100 13153
QMKMK590A7 CLAD6 Cladribin 12months M 1209002 1209002 1208461 1171649 1172398 1134117 1117971 734224 260959 216292 24198 22100
QMKMK591AF CLAD6 Cladribin 12months DN 1197736 1197736 1197184 1151818 1136481 1087259 1076116 597057 230367 158141 28591 25804
QMKMK592AN CLAD6 Cladribin 12months P 992655 992655 992309 965445 964234 935022 924219 613740 189846 142598 19691 18074
QMKMK593AV CLAD7 Cladribin baseline N 1072973 1072973 1072013 1039366 988048 953478 940620 440561 133368 110804 16445 7779
QMKMK594A5 CLAD7 Cladribin baseline M 1840517 1840517 1838589 1774842 1701120 1635963 1614648 951547 227992 188707 14405 12975
QMKMK595AD CLAD7 Cladribin baseline DN 1440796 1440796 1438064 1373169 1336916 1271791 1252865 628764 132142 78579 11112 9216
QMKMK596AL CLAD7 Cladribin baseline P 1677725 1677725 1676137 1618758 1542366 1484679 1464832 759842 228681 135178 19623 17045
QMKMK597AT CLAD7 Cladribin 6months N 1239270 1239270 1237713 1198319 1123326 1081563 1066953 497751 144787 123197 13744 7291
QMKMK598A3 CLAD7 Cladribin 6months M 1298404 1298404 1297197 1252956 1196708 1145838 1133594 718360 193455 162681 15846 12138
QMKMK599AB CLAD7 Cladribin 6months DN 1254978 1254978 1253336 1203733 1142735 1087229 1075266 641337 171226 151010 14466 9894
QMKMK600AI CLAD7 Cladribin 6months P 1479917 1479917 1470919 1412765 1358861 1304396 1281664 714210 66255 62209 3083 1415
QMKMK601AQ CLAD7 Cladribin 12months N 1149545 1149545 1148532 1113085 1063607 1023791 1009898 423783 141213 121701 15720 8170
QMKMK602A0 CLAD7 Cladribin 12months M 1939178 1939178 1936601 1866139 1800331 1717691 1698002 1106596 245522 189688 17128 15293
QMKMK603A8 CLAD7 Cladribin 12months DN 1545739 1545739 1541982 1470482 1406198 1325331 1310600 517285 81955 48826 7514 6121
QMKMK604AG CLAD7 Cladribin 12months P 1211943 1211943 1210523 1172308 1132847 1087549 1075259 486518 138915 90522 13011 10486
QMKMK605AO CLAD8 Cladribin baseline N 1444889 1444889 1444445 1385795 1385248 1321867 1304667 533333 155798 139077 20017 6759
QMKMK606AW CLAD8 Cladribin baseline M 1703561 1703561 1701051 1643939 1631017 1568457 1549559 1091551 151421 140102 8872 5779
QMKMK607A6 CLAD8 Cladribin baseline DN 1108324 1108324 1107613 1067244 1061080 1015816 1004178 528412 115795 81992 8232 6779
QMKMK608AE CLAD8 Cladribin baseline P 1540452 1540452 1539639 1477308 1482318 1412976 1397948 991926 207541 162117 13883 12397
QMKMK609AM CLAD8 Cladribin 6months N 834333 834333 834049 798958 780110 742394 733064 418241 125716 105779 11088 5615
QMKMK610AP CLAD8 Cladribin 6months M 1106235 1106235 1104644 1054961 1057632 1004099 991576 776744 157852 130084 6879 6471
QMKMK611AX CLAD8 Cladribin 6months DN 1303870 1303870 1303135 1240914 1243559 1172185 1160462 730474 200257 157489 15954 11884
QMKMK612A7 CLAD8 Cladribin 6months P 968338 968338 967925 925579 923220 878144 867982 661725 189758 152493 10350 8882
QMKMK613AF CLAD8 Cladribin 12months N 1798683 1798683 1798081 1723011 1727265 1641478 1620069 633213 173676 154775 21448 8049
QMKMK614AN CLAD8 Cladribin 12months M 1186393 1186393 1185783 1139636 1142249 1085053 1073036 752118 179324 153196 8280 7679
QMKMK615AV CLAD8 Cladribin 12months DN 1407945 1407945 1407291 1342821 1314510 1238663 1225435 715687 188862 157705 12270 9190
QMKMK616A5 CLAD8 Cladribin 12months P 1029639 1029639 1029226 988857 995363 947316 936477 661648 182340 158080 7835 7172

Plotting number of unique sequences

Plotting number of representative 2 sequences

Plotting number of Igblast identified sequences

Clonal abundance

For plotting the clonal abundance, the clones were ordered by size from bigger clones to smaller clones (x-axis, Rank). The Abundance of each clone was represented as the percentage of unique sequences in the clone, with respect to the total number of unique sequences in that subject (By Patient) or in the B-cell or T-cell sample (By Cell Population).

To correct for the different number of sequences in each of the samples, the Bootstrapping technique was employed, in which 200 random bootstrap samples were taken, with size the number of sequences in the sample with less sequences (N). The solid line shows the mean Abundance of the bootstrap samples, whereas the transparent area shows the full Abundance range of the bootstrap samples.

All clonal abundance plots and tables with abundance values can be found under repertoire_analysis/Abundance.

Clonal abundance per subject

Calculate area under the curve for abundance

Count clones per subject

Clonal abundance per cell population

If different types of B-cell or T-cell populations are provided, here the clonal abundance is plotted for each patient and B / T-cell population.

Clonal diversity

The clonal diversity \(D\) of the repertoire was calculated according to the general formula of Hill Diversity numbers:

\[ \begin{aligned} ^{q}D = \left( \sum_{i=1}^Rp_i^q \right)^{1/(1-q)} \end{aligned} \]

where:

At \(q=1\) the function is undefined and the limit to zero equals the exponential of the Shannon Entropy:

\[ \begin{aligned} ^{1}D = exp \left( \sum_{i=1}^Rp_i ln(p_i) \right) \end{aligned} \]

The intuition about the different Hill Diversity values is the following:

All clonal diversity plots and tables with diversity values can be found under repertoire_analysis/Diversity. To correct for the different number of sequences in each of the samples, the Bootstrapping technique was employed, in which 200 random bootstrap samples were taken, with size the number of sequences in the sample with less sequences (N). The solid line shows the mean Diversity of the bootstrap samples, whereas the transparent area shows the full Diversity range of the bootstrap samples.

Clonal diversity per subject

Clonal diversity at specific q values

q=1

q=0

Clonal diversity per cell population


|===                                                                     |  5% ~38 s remaining    
|====                                                                    |  6% ~38 s remaining    
|=====                                                                   |  7% ~1 m remaining     
|======                                                                  |  8% ~1 m remaining     
|======                                                                  |  9% ~1 m remaining     
|=======                                                                 | 11% ~1 m remaining     
|========                                                                | 12% ~1 m remaining     
|=========                                                               | 13% ~1 m remaining     
|=========                                                               | 14% ~57 s remaining    
|==========                                                              | 15% ~53 s remaining    
|===========                                                             | 16% ~51 s remaining    
|============                                                            | 17% ~48 s remaining    
|============                                                            | 18% ~46 s remaining    
|=============                                                           | 19% ~43 s remaining    
|==============                                                          | 20% ~42 s remaining    
|===============                                                         | 21% ~40 s remaining    
|===============                                                         | 22% ~39 s remaining    
|================                                                        | 23% ~37 s remaining    
|=================                                                       | 24% ~41 s remaining    
|==================                                                      | 25% ~39 s remaining    
|==================                                                      | 26% ~38 s remaining    
|===================                                                     | 27% ~36 s remaining    
|====================                                                    | 28% ~35 s remaining    
|=====================                                                   | 29% ~34 s remaining    
|=====================                                                   | 31% ~33 s remaining    
|======================                                                  | 32% ~32 s remaining    
|=======================                                                 | 33% ~37 s remaining    
|========================                                                | 34% ~35 s remaining    
|=========================                                               | 35% ~34 s remaining    
|=========================                                               | 36% ~33 s remaining    
|==========================                                              | 37% ~32 s remaining    
|===========================                                             | 38% ~31 s remaining    
|============================                                            | 39% ~30 s remaining    
|============================                                            | 40% ~29 s remaining    
|=============================                                           | 41% ~29 s remaining    
|==============================                                          | 42% ~28 s remaining    
|===============================                                         | 43% ~27 s remaining    
|===============================                                         | 44% ~26 s remaining    
|================================                                        | 45% ~25 s remaining    
|=================================                                       | 46% ~25 s remaining    
|==================================                                      | 47% ~24 s remaining    
|==================================                                      | 48% ~24 s remaining    
|===================================                                     | 49% ~23 s remaining    
|====================================                                    | 51% ~22 s remaining    
|=====================================                                   | 52% ~21 s remaining    
|=====================================                                   | 53% ~21 s remaining    
|======================================                                  | 54% ~20 s remaining    
|=======================================                                 | 55% ~19 s remaining    
|========================================                                | 56% ~19 s remaining    
|========================================                                | 57% ~18 s remaining    
|=========================================                               | 58% ~18 s remaining    
|==========================================                              | 59% ~17 s remaining    
|===========================================                             | 60% ~17 s remaining    
|===========================================                             | 61% ~16 s remaining    
|============================================                            | 62% ~16 s remaining    
|=============================================                           | 63% ~15 s remaining    
|==============================================                          | 64% ~15 s remaining    
|==============================================                          | 65% ~14 s remaining    
|===============================================                         | 66% ~14 s remaining    
|================================================                        | 67% ~13 s remaining    
|=================================================                       | 68% ~12 s remaining    
|==================================================                      | 69% ~12 s remaining    
|==================================================                      | 71% ~12 s remaining    
|===================================================                     | 72% ~11 s remaining    
|====================================================                    | 73% ~11 s remaining    
|=====================================================                   | 74% ~10 s remaining    
|=====================================================                   | 75% ~10 s remaining    
|======================================================                  | 76% ~9 s remaining     
|=======================================================                 | 77% ~9 s remaining     
|========================================================                | 78% ~8 s remaining     
|========================================================                | 79% ~8 s remaining     
|=========================================================               | 80% ~8 s remaining     
|==========================================================              | 81% ~7 s remaining     
|===========================================================             | 82% ~7 s remaining     
|===========================================================             | 83% ~6 s remaining     
|============================================================            | 84% ~6 s remaining     
|=============================================================           | 85% ~5 s remaining     
|==============================================================          | 86% ~5 s remaining     
|==============================================================          | 87% ~5 s remaining     
|===============================================================         | 88% ~4 s remaining     
|================================================================        | 89% ~4 s remaining     
|=================================================================       | 91% ~3 s remaining     
|=================================================================       | 92% ~3 s remaining     
|==================================================================      | 93% ~3 s remaining     
|===================================================================     | 94% ~2 s remaining     
|====================================================================    | 95% ~2 s remaining     
|====================================================================    | 96% ~1 s remaining     
|=====================================================================   | 97% ~1 s remaining     
|======================================================================  | 98% ~1 s remaining     
|======================================================================= | 99% ~0 s remaining     
|========================================================================|100% ~0 s remaining     

Clonal diversity per population at specific q values

q=1

q=0

V gene usage

V gene family usage

The V gene usage (in percentage) in each of the samples is represented below. All plots and tables can be found here.

Gene family usage is normalized by the number of clones.

By patient

By Population

V gene usage

The V gene usage (in percentage) in each of the samples is represented below. All plots and tables can be found here.

By clones

By sequences

Isotype usage

Isotype usage per subject

`summarise()` has grouped output by 'isotype', 'sample', 'source', 'treatment'. You can override using the `.groups` argument.

Isotype usage per cell population

`summarise()` has grouped output by 'isotype', 'sample_pop', 'source', 'treatment', 'extract_time'. You can override using the `.groups` argument.

Clonal overlap analysis

'repertoire_comparison/Clone_overlap' already existsError in paste(outdir, "Clone_overlap", names(df_pat)[i], sep = "/") : 
  object 'i' not found

Citations

If you use nf-core/bcellmagic for your analysis, please cite it using the following DOI: 10.5281/zenodo.3607408

Please also cite the nf-core publication (P. A. Ewels et al. 2020).

In addition, citations for the tools and data used in this pipeline are as follows:

Andrews, Simon et al. 2010. “FastQC: A Quality Control Tool for High Throughput Sequence Data.”
Ewels, Philip A., Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso, and Sven Nahnsen. 2020. “The Nf-Core Framework for Community-Curated Bioinformatics Pipelines.” Nature Biotechnology 38 (3): 276–78. https://doi.org/10.1038/s41587-020-0439-x.
Ewels, Philip, Måns Magnusson, Sverker Lundin, and Max Käller. 2016. “MultiQC: Summarize Analysis Results for Multiple Tools and Samples in a Single Report.” Bioinformatics 32 (19): 3047–48.
Gadala-Maria, Daniel, Gur Yaari, Mohamed Uduman, and Steven H. Kleinstein. 2015. “Automated Analysis of High-Throughput b-Cell Sequencing Data Reveals a High Frequency of Novel Immunoglobulin v Gene Segment Alleles.” Proceedings of the National Academy of Sciences of the United States of America 112 (8): E862–870. https://doi.org/10.1073/pnas.1417683112.
Gupta, Namita T., Jason A. Vander Heiden, Mohamed Uduman, Daniel Gadala-Maria, Gur Yaari, and Steven H. Kleinstein. 2015. “Change-o: A Toolkit for Analyzing Large-Scale b Cell Immunoglobulin Repertoire Sequencing Data.” Bioinformatics 31 (20): 3356–58. https://doi.org/10.1093/bioinformatics/btv359.
Stern, Joel N. H., Gur Yaari, Jason A. Vander Heiden, George Church, William F. Donahue, Rogier Q. Hintzen, Anita J. Huttner, et al. 2014. “B Cells Populating the Multiple Sclerosis Brain Mature in the Draining Cervical Lymph Nodes.” Science Translational Medicine 6 (248). https://doi.org/10.1126/scitranslmed.3008879.
Vander Heiden, Jason A., Gur Yaari, Mohamed Uduman, Joel N. H. Stern, Kevin C. O’Connor, David A. Hafler, Francois Vigneault, and Steven H. Kleinstein. 2014. “pRESTO: A Toolkit for Processing High-Throughput Sequencing Raw Reads of Lymphocyte Receptor Repertoires.” Bioinformatics 30 (13): 1930–32. https://doi.org/10.1093/bioinformatics/btu138.
LS0tCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGFibGUgb2YgY29udGVudHMKICAgIHRvY19mbG9hdDogdHJ1ZSAgICAgICAgICAgICAgICAgICAgICAgICAjIGZsb2F0IHRoZSB0YWJsZSBvZiBjb250ZW50cyB0byB0aGUgbGVmdCBvZiB0aGUgbWFpbiBkb2N1bWVudCBjb250ZW50CiAgICB0b2NfZGVwdGg6IDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBoZWFkZXIgbGV2ZWxzIDEsMiwzCiAgICB0aGVtZTogZGVmYXVsdAogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZSAgICAgICAgICAgICAgICAgICMgYWRkIHNlY3Rpb24gbnVtYmVyaW5nIHRvIGhlYWRlcnMKICAgIGRmX3ByaW50OiBwYWdlZCAgICAgICAgICAgICAgICAgICAgICAgICAjIHRhYmxlcyBhcmUgcHJpbnRlZCBhcyBhbiBodG1sIHRhYmxlIHdpdGggc3VwcG9ydCBmb3IgcGFnaW5hdGlvbiBvdmVyIHJvd3MgYW5kIGNvbHVtbnMKICAgIGNzczogLi9uZi1jb3JlX3N0eWxlLmNzcwogICAgaGlnaGxpZ2h0OiBweWdtZW50cwogICAgcGRmX2RvY3VtZW50OiB0cnVlCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCmJpYmxpb2dyYXBoeTogLi9yZWZlcmVuY2VzLmJpYnRleAotLS0KCgotLS0KdGl0bGU6ICJSZXBlcnRvaXJlIGFuYWx5c2lzIgpzdWJ0aXRsZTogIkNsb25hbCBhYnVuZGFuY2UsIGRpdmVyc2l0eSBhbmQgVi1mYW1pbHkgZ2VuZSB1c2FnZSIKZGF0ZTogJ2ByIGZvcm1hdChTeXMuRGF0ZSgpLCAiJUIgJWQsICVZIilgJwpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQKLS0tCgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShkcGx5cikKbGlicmFyeShhbGFrYXphbSkKbGlicmFyeShzaGF6YW0pCmxpYnJhcnkoc3RyaW5ncikKCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShpZ3JhcGgpCmxpYnJhcnkoZ3Bsb3RzKQpsaWJyYXJ5KGNpcmNsaXplKQpsaWJyYXJ5KFVwU2V0UikKbGlicmFyeShndG9vbHMpCgp0aGVtZV9zZXQodGhlbWVfYncoYmFzZV9mYW1pbHkgPSAiQXJpYWxNVCIpICsKICAgICAgICAgICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHk9IkFyaWFsTVQiKSkpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpCmBgYAoqKioKCiMgQmNlbGxtYWdpYyBhbmFseXNpcyBwaXBlbGluZQoKIyMgUGlwZWxpbmUgb3ZlcnZpZXcKCiMjIE51bWJlciBvZiBzZXF1ZW5jZXMKCk51bWJlciBvZiByZWFkcyBmb3IgZWFjaCBvZiB0aGUgc2FtcGxlcyBhbmQgbnVtYmVyIG9mIHNlcXVlbmNlcyBsZWZ0IGFmdGVyIHJlcHJlc2VudGF0aXZlIGFuYWx5c2lzIHN0ZXBzLgoKYGBge3Igc2VxX251bWJlcnMsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQojVE9ETyByZWFkIFRhYmxlIHNlcXVlbmNlcwp0YWJfc2VxcyA8LSByZWFkLnRhYmxlKCIuLi9wYXJzZWRfbG9ncy9zZXF1ZW5jZXNfdGFibGUvVGFibGVfc2VxdWVuY2VzX3Byb2Nlc3MudHN2IiwgaGVhZGVyPVRSVUUsIHNlcD0iXHQiLCBjaGVjay5uYW1lcyA9IEZBTFNFKQprYWJsZSh0YWJfc2VxcykgJT4lCiAgICBrYWJsZV9zdHlsaW5nKCJob3ZlciIpICU+JQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjQwMHB4IikKYGBgCgpQbG90dGluZyBudW1iZXIgb2YgdW5pcXVlIHNlcXVlbmNlcwoKYGBge3Igc2VxX251bWJlcnNfcGxvdF91bmlxdWUsIGZpZy53aWR0aD0xMCwgZmlnLmFzcD0wLjMsIGVjaG89RkFMU0V9CnRhYl9zZXFzJEV4dHJhY3Rpb25fdGltZSA8LSBmYWN0b3IodGFiX3NlcXMkRXh0cmFjdGlvbl90aW1lLCBsZXZlbHM9YygiYmFzZWxpbmUiLCI2bW9udGhzIiwiMTJtb250aHMiKSkKZzQgPC0gZ2dwbG90KHRhYl9zZXFzLCBhZXMoZmlsbD1FeHRyYWN0aW9uX3RpbWUsIHk9VW5pcXVlLCB4PVBvcHVsYXRpb24pKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKICB4bGFiKCIiKSArCiAgeWxhYigiU2VxdWVuY2UgbnVtYmVyIikgKwogIGdndGl0bGUoIlVuaXF1ZSBzZXF1ZW5jZSBudW1iZXJzIHBlciBzYW1wbGUiKSArCiAgZmFjZXRfZ3JpZChjb2xzPXZhcnMoU291cmNlKSwgc2NhbGVzID0gImZyZWUiLCBkcm9wID0gVCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmc0CmBgYAoKClBsb3R0aW5nIG51bWJlciBvZiByZXByZXNlbnRhdGl2ZSAyIHNlcXVlbmNlcwoKYGBge3Igc2VxX251bWJlcnNfcGxvdF9yZXAyLCBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC4zLCBlY2hvPUZBTFNFfQpnNCA8LSBnZ3Bsb3QodGFiX3NlcXMsIGFlcyhmaWxsPUV4dHJhY3Rpb25fdGltZSwgeT1SZXByZXNlbnRhdGl2ZV8yLCB4PVBvcHVsYXRpb24pKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKICB4bGFiKCIiKSArCiAgeWxhYigiU2VxdWVuY2UgbnVtYmVyIikgKwogIGdndGl0bGUoIlJlcHJlc2VudGF0aXZlMiBzZXF1ZW5jZSBudW1iZXJzIHBlciBzYW1wbGUiKSArCiAgZmFjZXRfZ3JpZChjb2xzPXZhcnMoU291cmNlKSwgc2NhbGVzID0gImZyZWUiLCBkcm9wID0gVCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmc0CmBgYAoKClBsb3R0aW5nIG51bWJlciBvZiBJZ2JsYXN0IGlkZW50aWZpZWQgc2VxdWVuY2VzCgoKYGBge3Igc2VxX251bWJlcnNfcGxvdCwgZmlnLndpZHRoPTEwLCBmaWcuYXNwPTAuMywgZWNobz1GQUxTRX0KZzQgPC0gZ2dwbG90KHRhYl9zZXFzLCBhZXMoZmlsbD1FeHRyYWN0aW9uX3RpbWUsIHk9SWdibGFzdCwgeD1Qb3B1bGF0aW9uKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgeGxhYigiIikgKwogIHlsYWIoIlNlcXVlbmNlIG51bWJlciIpICsKICBnZ3RpdGxlKCJJZ2JsYXN0IGlkZW50aWZpZWQgc2VxdWVuY2UgbnVtYmVyIHBlciBzYW1wbGUiKSArCiAgZmFjZXRfZ3JpZChjb2xzPXZhcnMoU291cmNlKSwgc2NhbGVzID0gImZyZWUiLCBkcm9wID0gVCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmc0CmBgYAoKCgpgYGB7ciByZWFkX2RhdGEsIGluY2x1ZGU9RkFMU0V9CiMgUmVhZGluZyBkYXRhIHRhYmxlcyBhbmQgY2VhdGluZyBvdXRwdXQgZm9sZGVycwpkYXRhZGlyIDwtICIuIgpvdXRkaXIgPC0gInJlcGVydG9pcmVfY29tcGFyaXNvbiIKIyBzZXR3ZCB0byByZXN1bHRzIGZvbGRlciAoY29udGFpbmluZyBhbGFrYXphbSwgc2hhemFtLCBldGMuIGZvbGRlcnMpCiMjIyBSZWFkIGFsbCB0aGUgdGFibGVzIGFzIHByb2R1Y2VkIGJ5IHRoZSBwaXBlbGluZSBpbiB0aGUgY3VycmVudCBmb2xkZXIgYW5kIGpvaW5zIHRoZW0gdG9nZXRoZXIgaW4gdGhlIGRmX2FsbCBkYXRhZnJhbWUKI2FsbF9maWxlcyA8LSBzeXN0ZW0ocGFzdGUwKCJmaW5kICciLGRhdGFkaXIsIicgLW5hbWUgJypnZXJtLXBhc3MudHN2JyIpLCBpbnRlcm49VCkKZGlyLmNyZWF0ZShvdXRkaXIpCmRpdmVyc2l0eV9kaXIgPC0gcGFzdGUob3V0ZGlyLCAiRGl2ZXJzaXR5Iiwgc2VwPSIvIikKYWJ1bmRhbmNlX2RpciA8LSBwYXN0ZShvdXRkaXIsICJBYnVuZGFuY2UiLCBzZXA9Ii8iKQp2ZmFtaWx5X2RpciA8LSBwYXN0ZShvdXRkaXIsICJWX2ZhbWlseSIsIHNlcD0iLyIpCmlzb3R5cGVfZGlyIDwtIHBhc3RlKG91dGRpciwgIklzb3R5cGUiLCBzZXA9Ii8iKQpkaXIuY3JlYXRlKGRpdmVyc2l0eV9kaXIpCmRpci5jcmVhdGUoYWJ1bmRhbmNlX2RpcikKZGlyLmNyZWF0ZSh2ZmFtaWx5X2RpcikKZGlyLmNyZWF0ZShpc290eXBlX2RpcikKIyBHZW5lcmF0ZSBvbmUgYmlnIGRhdGFmcmFtZSBmcm9tIGFsbCBwYXRpZW50IGRhdGFmcmFtZXMKI2RmX2FsbCA9IGRhdGEuZnJhbWUoKQojZm9yIChmaWxlIGluIGFsbF9maWxlcyl7CiMgICAgZm5hbWUgPSBmaWxlCiMgICAgcHJpbnQoZm5hbWUpCiMgICAgZGZfcGF0IDwtIHJlYWQuY3N2KGZuYW1lLCBzZXA9Ilx0IikKIyAgICBkZl9hbGwgPC0gcmJpbmQoZGZfYWxsLCBkZl9wYXQpCiN9CiN3cml0ZS50YWJsZShkZl9hbGwsIHBhc3RlMChvdXRkaXIsIi9hbGxfZGF0YS50c3YiKSwgc2VwID0gIlx0IiwgcXVvdGU9Riwgcm93Lm5hbWVzID0gRiwgY29sLm5hbWVzID0gVCkKZGZfYWxsIDwtIHJlYWQuY3N2KCIuLi9yZXBlcnRvaXJlX2FuYWx5c2lzL3JlcGVydG9pcmVfY29tcGFyaXNvbi9hbGxfZGF0YS50c3YiLCBzZXA9Ilx0IikKCiMgUmVtb3ZlIHVuZGVyc2NvcmVzIGluIHRoZXNlIGNvbHVtbnMKZGZfYWxsJHRyZWF0bWVudCA8LSBzYXBwbHkoZGZfYWxsJHRyZWF0bWVudCwgZnVuY3Rpb24oeCkgc3RyX3JlcGxhY2UoYXMuY2hhcmFjdGVyKHgpLCAiXyIsICIiKSkKZGZfYWxsJHNvdXJjZSA8LSBzYXBwbHkoZGZfYWxsJHNvdXJjZSwgZnVuY3Rpb24oeCkgc3RyX3JlcGxhY2UoYXMuY2hhcmFjdGVyKHgpLCAiXyIsICIiKSkKZGZfYWxsJGV4dHJhY3RfdGltZSA8LSBzYXBwbHkoZGZfYWxsJGV4dHJhY3RfdGltZSwgZnVuY3Rpb24oeCkgc3RyX3JlcGxhY2UoYXMuY2hhcmFjdGVyKHgpLCAiXyIsICIiKSkKZGZfYWxsJHBvcHVsYXRpb24gPC0gc2FwcGx5KGRmX2FsbCRwb3B1bGF0aW9uLCBmdW5jdGlvbih4KSBzdHJfcmVwbGFjZShhcy5jaGFyYWN0ZXIoeCksICJfIiwgIiIpKQojIEFubm90YXRlIHNhbXBsZSBhbmQgc2FtcGxlcG9wIChzYW1wbGUgKyBwb3B1bGF0aW9uKSBieSBhZGQgaW5nIGFsbCB0aGUgY29uZGl0aW9ucwpkZl9hbGwkc2FtcGxlIDwtIGFzLmZhY3RvcihwYXN0ZShkZl9hbGwkdHJlYXRtZW50LCBkZl9hbGwkZXh0cmFjdF90aW1lLCBkZl9hbGwkc291cmNlLCBzZXA9Il8iKSkKZGZfYWxsJHNhbXBsZV9wb3AgPC0gYXMuZmFjdG9yKHBhc3RlKGRmX2FsbCR0cmVhdG1lbnQsIGRmX2FsbCRleHRyYWN0X3RpbWUsIGRmX2FsbCRzb3VyY2UsIGRmX2FsbCRwb3B1bGF0aW9uLCBzZXA9Il8iKSkKIyBTZXQgbnVtYmVyIG9mIGJvb3Ryc3RyYXBzCm5ib290ID0gMjAwCgojIFJlbW92aW5nIENsYWRyaWJpbl82bW9udGhzX0NMQUQ0X04gYmVjYXVzZSBvZiB0b28gbGl0dGxlIHNlcXVlbmNlcwpkZl9hbGwgPC0gZGZfYWxsWyEoZGZfYWxsJHNhbXBsZV9wb3A9PSJDbGFkcmliaW5fNm1vbnRoc19DTEFENF9OIiksXQoKYGBgCgojIENsb25hbCBhYnVuZGFuY2UKCkZvciBwbG90dGluZyB0aGUgY2xvbmFsIGFidW5kYW5jZSwgdGhlIGNsb25lcyB3ZXJlIG9yZGVyZWQgYnkgc2l6ZSBmcm9tIGJpZ2dlciBjbG9uZXMgdG8gc21hbGxlciBjbG9uZXMgKHgtYXhpcywgUmFuaykuClRoZSBBYnVuZGFuY2Ugb2YgZWFjaCBjbG9uZSB3YXMgcmVwcmVzZW50ZWQgYXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdW5pcXVlIHNlcXVlbmNlcyBpbiB0aGUgY2xvbmUsIHdpdGggcmVzcGVjdCB0byB0aGUgdG90YWwKbnVtYmVyIG9mIHVuaXF1ZSBzZXF1ZW5jZXMgaW4gdGhhdCBzdWJqZWN0IChCeSBQYXRpZW50KSBvciBpbiB0aGUgQi1jZWxsIG9yIFQtY2VsbCBzYW1wbGUgKEJ5IENlbGwgUG9wdWxhdGlvbikuCgpUbyBjb3JyZWN0IGZvciB0aGUgZGlmZmVyZW50IG51bWJlciBvZiBzZXF1ZW5jZXMgaW4gZWFjaCBvZiB0aGUgc2FtcGxlcywgdGhlIEJvb3RzdHJhcHBpbmcgdGVjaG5pcXVlIHdhcyBlbXBsb3llZCwKaW4gd2hpY2ggYHIgbmJvb3RgIHJhbmRvbSBib290c3RyYXAgc2FtcGxlcyB3ZXJlIHRha2VuLCB3aXRoIHNpemUgdGhlIG51bWJlciBvZiBzZXF1ZW5jZXMgaW4gdGhlIHNhbXBsZSB3aXRoIGxlc3Mgc2VxdWVuY2VzIChOKS4KVGhlIHNvbGlkIGxpbmUgc2hvd3MgdGhlIG1lYW4gQWJ1bmRhbmNlIG9mIHRoZSBib290c3RyYXAgc2FtcGxlcywgd2hlcmVhcyB0aGUgdHJhbnNwYXJlbnQgYXJlYSBzaG93cyB0aGUgZnVsbCBBYnVuZGFuY2UKcmFuZ2Ugb2YgdGhlIGJvb3RzdHJhcCBzYW1wbGVzLgoKQWxsIGNsb25hbCBhYnVuZGFuY2UgcGxvdHMgYW5kIHRhYmxlcyB3aXRoIGFidW5kYW5jZSB2YWx1ZXMgY2FuIGJlIGZvdW5kIHVuZGVyIGByZXBlcnRvaXJlX2FuYWx5c2lzL0FidW5kYW5jZWAuCgojIyBDbG9uYWwgYWJ1bmRhbmNlIHBlciBzdWJqZWN0CmBgYHtyIGNsb25hbF9hYnVuZGFuY2UsIGVjaG89RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmFidW5kIDwtIGVzdGltYXRlQWJ1bmRhbmNlKGRmX2FsbCwgZ3JvdXAgPSAic2FtcGxlIiwgY2k9MC45NSwgbmJvb3Q9bmJvb3QpCmFidW5kQGFidW5kYW5jZSR0cmVhdG1lbnQgPC0gc2FwcGx5KGFidW5kQGFidW5kYW5jZSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzFdKQphYnVuZEBhYnVuZGFuY2UkdGltZV9wb2ludCA8LSBzYXBwbHkoYWJ1bmRAYWJ1bmRhbmNlJHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMl0pCmFidW5kQGFidW5kYW5jZSRwYXRpZW50IDwtIHNhcHBseShhYnVuZEBhYnVuZGFuY2Ukc2FtcGxlLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVszXSkKYWJ1bmRfbWFpbiA8LSBwYXN0ZTAoIkNsb25hbCBhYnVuZGFuY2UgKE49IiwgYWJ1bmRAblsxXSwgIikiKQpgYGAKYGBge3IgY2xvbmFsX2FidW5kYW5jZTIsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTEyLCBlY2hvPUZBTFNFfQpwX2NhIDwtIGdncGxvdChhYnVuZEBhYnVuZGFuY2UsIGFlcyh4ID0gcmFuaywgeSA9IHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gc2FtcGxlKSkgKwogICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBsb3dlciwKICAgICAgICAgICAgICAgICAgICB5bWF4ID0gdXBwZXIsIGZpbGwgPSB0aW1lX3BvaW50KSwgYWxwaGEgPSAwLjQpICsKICAgIGdlb21fbGluZShhZXMoY29sb3IgPSB0aW1lX3BvaW50KSkgKwogICAgZ2d0aXRsZShhYnVuZF9tYWluKSArCiAgICB4bGFiKCJSYW5rIikgKyB5bGFiKCJBYnVuZGFuY2UiKSArCiAgICBzY2FsZV94X2xvZzEwKGxpbWl0cyA9IE5VTEwsCiAgICAgICAgICAgICAgICBicmVha3MgPSBzY2FsZXM6OnRyYW5zX2JyZWFrcygibG9nMTAiLCBmdW5jdGlvbih4KSAxMF54KSwKICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6dHJhbnNfZm9ybWF0KCJsb2cxMCIsIHNjYWxlczo6bWF0aF9mb3JtYXQoMTBeLngpKSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogICAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhwYXRpZW50KSwgcm93cyA9IHZhcnModHJlYXRtZW50KSwgc2NhbGVzPSJmcmVlIiwgZHJvcCA9IFQpCnBfY2EKYGBgCgpgYGB7ciBpbmNsdWRlID0gRkFMU0V9Cmdnc2F2ZShwbG90PXBfY2EsIGZpbGVuYW1lID0gcGFzdGUwKGFidW5kYW5jZV9kaXIsIi9DbG9uYWxfYWJ1bmRhbmNlX3N1YmplY3QucGRmIiksIGRldmljZT0icGRmIiwgd2lkdGggPSAyNSwgaGVpZ2h0ID0gNiwgdW5pdHM9ImNtIikKZ2dzYXZlKHBsb3Q9cF9jYSwgZmlsZW5hbWUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwiL0Nsb25hbF9hYnVuZGFuY2Vfc3ViamVjdC5wbmciKSwgZGV2aWNlPSJwbmciLCB3aWR0aCA9IDI1LCBoZWlnaHQgPSA2LCB1bml0cz0iY20iKQp3cml0ZS50YWJsZShhYnVuZEBhYnVuZGFuY2UsIGZpbGUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwgIi9DbG9uYWxfYWJ1bmRhbmNlX2RhdGFfc3ViamVjdC50c3YiKSwgc2VwPSJcdCIsIHF1b3RlID0gRiwgcm93Lm5hbWVzID0gRikKYGBgCgojIyMgQ2FsY3VsYXRlIGFyZWEgdW5kZXIgdGhlIGN1cnZlIGZvciBhYnVuZGFuY2UKCmBgYHtyIGF1Y30KCmBgYAoKIyMgQ291bnQgY2xvbmVzIHBlciBzdWJqZWN0CgpgYGB7ciBjb3VudF9jbG9uZXN9CmRmX2NvdW50Y2xvbmVzX2NvcHkgPC0gY291bnRDbG9uZXMoZGZfYWxsLGdyb3Vwcz0ic2FtcGxlIixjb3B5ID0gImR1cGxpY2F0ZV9jb3VudCIpCmRmX2NvdW50Y2xvbmVzX2NvcHkkdHJlYXRtZW50IDwtIHNhcHBseShkZl9jb3VudGNsb25lc19jb3B5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMV0pCmRmX2NvdW50Y2xvbmVzX2NvcHkkdGltZV9wb2ludCA8LSBzYXBwbHkoZGZfY291bnRjbG9uZXNfY29weSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzJdKQpkZl9jb3VudGNsb25lc19jb3B5JHBhdGllbnQgPC0gc2FwcGx5KGRmX2NvdW50Y2xvbmVzX2NvcHkkc2FtcGxlLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVszXSkKd3JpdGUudGFibGUoZGZfY291bnRjbG9uZXNfY29weSwgZmlsZSA9IHBhc3RlMChhYnVuZGFuY2VfZGlyLCAiL0Nsb25hbF9udW1iZXJzX2RhdGFfc3ViamVjdC50c3YiKSwgc2VwID0gIlx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQpgYGAKCiMjIENsb25hbCBhYnVuZGFuY2UgcGVyIGNlbGwgcG9wdWxhdGlvbgoKSWYgZGlmZmVyZW50IHR5cGVzIG9mIEItY2VsbCBvciBULWNlbGwgcG9wdWxhdGlvbnMgYXJlIHByb3ZpZGVkLCBoZXJlCnRoZSBjbG9uYWwgYWJ1bmRhbmNlIGlzIHBsb3R0ZWQgZm9yIGVhY2ggcGF0aWVudCBhbmQgQiAvIFQtY2VsbCBwb3B1bGF0aW9uLgoKYGBge3IgY2xvbmFsX2FidW5kYW5jZV9wb3AsIGVjaG89RkFMU0UsIGluY2x1ZGU9RkFMU0V9CgphYnVuZF9wb3AgPC0gZXN0aW1hdGVBYnVuZGFuY2UoZGZfYWxsLCBjbG9uZT0iY2xvbmVfaWQiLCBncm91cCA9ICJzYW1wbGVfcG9wIiwgY2k9MC45NSwgbmJvb3Q9bmJvb3QpCmFidW5kX3BvcEBhYnVuZGFuY2UkdHJlYXRtZW50IDwtIHNhcHBseShhYnVuZF9wb3BAYWJ1bmRhbmNlJHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzFdKQphYnVuZF9wb3BAYWJ1bmRhbmNlJHRpbWVfcG9pbnQgPC0gc2FwcGx5KGFidW5kX3BvcEBhYnVuZGFuY2Ukc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMl0pCmFidW5kX3BvcEBhYnVuZGFuY2UkcGF0aWVudCA8LSBzYXBwbHkoYWJ1bmRfcG9wQGFidW5kYW5jZSRzYW1wbGVfcG9wLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVszXSkKYWJ1bmRfcG9wQGFidW5kYW5jZSRwb3B1bGF0aW9uIDwtIHNhcHBseShhYnVuZF9wb3BAYWJ1bmRhbmNlJHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzRdKQphYnVuZF9tYWluIDwtIHBhc3RlMCgiQ2xvbmFsIGFidW5kYW5jZSAoTj0iLCBhYnVuZF9wb3BAblsxXSwgIikiKQpgYGAKYGBge3IgY2xvbmFsX2FidW5kYW5jZV9wb3AyLCBmaWcud2lkdGg9MTIsIGVjaG89RkFMU0V9CnBvcF9jYSA8LSBnZ3Bsb3QoYWJ1bmRfcG9wQGFidW5kYW5jZSwgYWVzKHggPSByYW5rLCB5ID0gcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IHNhbXBsZV9wb3ApKSArCiAgICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IGxvd2VyLAogICAgICAgICAgICAgICAgICAgIHltYXggPSB1cHBlciwgZmlsbCA9IHRpbWVfcG9pbnQpLCBhbHBoYSA9IDAuNCkgKwogICAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IHRpbWVfcG9pbnQpKSArCiAgICBnZ3RpdGxlKGFidW5kX21haW4pICsKICAgIHhsYWIoIlJhbmsiKSArIHlsYWIoIkFidW5kYW5jZSIpICsKICAgIHNjYWxlX3hfbG9nMTAobGltaXRzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzY2FsZXM6OnRyYW5zX2JyZWFrcygibG9nMTAiLCBmdW5jdGlvbih4KSAxMF54KSwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6OnRyYW5zX2Zvcm1hdCgibG9nMTAiLCBzY2FsZXM6Om1hdGhfZm9ybWF0KDEwXi54KSkpICsKICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICAgIGZhY2V0X2dyaWQoY29scz12YXJzKHBhdGllbnQpLCByb3dzPXZhcnMocG9wdWxhdGlvbiksIHNjYWxlcz0iZnJlZSIsIGRyb3AgPSBUKQpwb3BfY2EKYGBgCmBgYHtyIGluY2x1ZGU9RkFMU0V9Cmdnc2F2ZShwbG90PXBvcF9jYSwgZmlsZW5hbWUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwiL0Nsb25hbF9hYnVuZGFuY2VfcGF0aWVudF9wb3B1bGF0aW9uLnBkZiIpLCBkZXZpY2U9InBkZiIsCiAgICAgICAgd2lkdGggPSAzMCwgaGVpZ2h0ID0gMjAsIHVuaXRzPSJjbSIpCmdnc2F2ZShwbG90PXBvcF9jYSwgZmlsZW5hbWUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwiL0Nsb25hbF9hYnVuZGFuY2VfcGF0aWVudF9wb3B1bGF0aW9uLnBuZyIpLCBkZXZpY2U9InBuZyIsCiAgICAgICAgd2lkdGggPSAzMCwgaGVpZ2h0ID0gMjAsIHVuaXRzPSJjbSIpCndyaXRlLnRhYmxlKGFidW5kX3BvcEBhYnVuZGFuY2UsIGZpbGUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwgIi9DbG9uYWxfYWJ1bmRhbmNlX2RhdGFfY2VsbF9wb3B1bGF0aW9uLnRzdiIpLCBzZXA9Ilx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQoKYGBgCgojIENsb25hbCBkaXZlcnNpdHkKClRoZSBjbG9uYWwgZGl2ZXJzaXR5ICREJCBvZiB0aGUgcmVwZXJ0b2lyZSB3YXMgY2FsY3VsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGdlbmVyYWwgZm9ybXVsYSBvZiBIaWxsIERpdmVyc2l0eQpudW1iZXJzOgoKJCQKXGJlZ2lue2FsaWduZWR9CiAgICBee3F9RCA9IFxsZWZ0KCBcc3VtX3tpPTF9XlJwX2lecSBccmlnaHQpXnsxLygxLXEpfQpcZW5ke2FsaWduZWR9CiQkCgp3aGVyZToKCiogJHBfaSQgaXMgdGhlIHByb3BvcnRpb24gb2YgdW5pcXVlIHNlcXVlbmNlcyBiZWxvbmdpbmcgdG8gY2xvbmUgJGkkLgoqICRxJCBhcmUgdGhlIHZhbHVlcyBvZiB0aGUgZGlmZmVyZW50IGRpdmVyc2l0eSBudW1iZXJzLgoqICRSJCBpcyB0aGUgUmljaG5lc3MsIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGNsb25lcyBpbiB0aGUgc2FtcGxlLgoKQXQgJHE9MSQgdGhlIGZ1bmN0aW9uIGlzIHVuZGVmaW5lZCBhbmQgdGhlIGxpbWl0IHRvIHplcm8gZXF1YWxzIHRoZSBleHBvbmVudGlhbCBvZiB0aGUgU2hhbm5vbiBFbnRyb3B5OgoKJCQKXGJlZ2lue2FsaWduZWR9CiAgICBeezF9RCA9IGV4cCBcbGVmdCggIFxzdW1fe2k9MX1eUnBfaSBsbihwX2kpICBccmlnaHQpClxlbmR7YWxpZ25lZH0KJCQKClRoZSBpbnR1aXRpb24gYWJvdXQgdGhlIGRpZmZlcmVudCBIaWxsIERpdmVyc2l0eSB2YWx1ZXMgaXMgdGhlIGZvbGxvd2luZzoKCiogQXQgJHE9MCQgdGhlIGRpdmVyc2l0eSBpbmRleCBlcXVhbHMgdGhlIG51bWJlciBvZiBjbG9uZXMgaW4gdGhlIHNhbXBsZS4KKiBBdCAkcT0xJCB0aGUgZGl2ZXJzaXR5IGluZGV4IGlzIHRoZSBnZW9tZXRyaWMgbWVhbiBvZiB0aGUgY2xvbmVzIGluIHRoZSBzYW1wbGUsCndlaWdodGVkIGJ5IHRoZWlyIHByb3BvcnRpb24gaW4gdGhlIHNhbXBsZS4KKiBBdCAkcT4xJCBtb3JlIHdlaWdodCBpcyBnaXZlbiB0byB0aGUgY2xvbmVzIHdpdGggaGlnaGVyIHByb3BvcnRpb25zIGluIHRoZSBzYW1wbGUuCgpBbGwgY2xvbmFsIGRpdmVyc2l0eSBwbG90cyBhbmQgdGFibGVzIHdpdGggZGl2ZXJzaXR5IHZhbHVlcyBjYW4gYmUgZm91bmQgdW5kZXIgYHJlcGVydG9pcmVfYW5hbHlzaXMvRGl2ZXJzaXR5YC4KVG8gY29ycmVjdCBmb3IgdGhlIGRpZmZlcmVudCBudW1iZXIgb2Ygc2VxdWVuY2VzIGluIGVhY2ggb2YgdGhlIHNhbXBsZXMsIHRoZSBCb290c3RyYXBwaW5nIHRlY2huaXF1ZSB3YXMgZW1wbG95ZWQsCmluIHdoaWNoIGByIG5ib290YCByYW5kb20gYm9vdHN0cmFwIHNhbXBsZXMgd2VyZSB0YWtlbiwgd2l0aCBzaXplIHRoZSBudW1iZXIgb2Ygc2VxdWVuY2VzIGluIHRoZSBzYW1wbGUgd2l0aCBsZXNzIHNlcXVlbmNlcyAoTikuClRoZSBzb2xpZCBsaW5lIHNob3dzIHRoZSBtZWFuIERpdmVyc2l0eSBvZiB0aGUgYm9vdHN0cmFwIHNhbXBsZXMsIHdoZXJlYXMgdGhlIHRyYW5zcGFyZW50IGFyZWEgc2hvd3MgdGhlIGZ1bGwgRGl2ZXJzaXR5CnJhbmdlIG9mIHRoZSBib290c3RyYXAgc2FtcGxlcy4KCgojIyBDbG9uYWwgZGl2ZXJzaXR5IHBlciBzdWJqZWN0CmBgYHtyIGNsb25hbF9kaXZlcnNpdHksIGVjaG8gPSBGQUxTRSwgaW5jbHVkZT1GQUxTRX0Kc2FtcGxlX2RpdiA8LSBhbHBoYURpdmVyc2l0eShhYnVuZCwgZ3JvdXA9InNhbXBsZSIsIG1pbl9xPTAsIG1heF9xPTQsIHN0ZXBfcT0wLjA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2k9MC45NSwgbmJvb3Q9bmJvb3QpCnNhbXBsZV9tYWluIDwtIHBhc3RlMCgiU2FtcGxlIGRpdmVyc2l0eSAoTj0iLCBzYW1wbGVfZGl2QG5bMV0sICIpIikKc2FtcGxlX2RpdkBkaXZlcnNpdHkkdHJlYXRtZW50IDwtIHNhcHBseShzYW1wbGVfZGl2QGRpdmVyc2l0eSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzFdKQpzYW1wbGVfZGl2QGRpdmVyc2l0eSR0aW1lX3BvaW50IDwtIHNhcHBseShzYW1wbGVfZGl2QGRpdmVyc2l0eSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzJdKQpzYW1wbGVfZGl2QGRpdmVyc2l0eSRwYXRpZW50IDwtIHNhcHBseShzYW1wbGVfZGl2QGRpdmVyc2l0eSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzNdKQpgYGAKYGBge3IgY2xvbmFsX2RpdmVyc2l0eTIsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTEyLCBlY2hvID0gRkFMU0V9CmRpdl9wIDwtIGdncGxvdChzYW1wbGVfZGl2QGRpdmVyc2l0eSwgYWVzKHggPSBxLCB5ID0gZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gc2FtcGxlKSkgKwogICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBkX2xvd2VyLAogICAgICAgICAgICAgICAgICAgIHltYXggPSBkX3VwcGVyLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSB0aW1lX3BvaW50KSwgYWxwaGEgPSAwLjQpICsKICAgIGdlb21fbGluZShhZXMoY29sb3IgPSB0aW1lX3BvaW50KSkgKwogICAgeGxhYigicSIpICsgeWxhYihleHByZXNzaW9uKCIiXnEgKiBEKSkgKwogICAgZ2d0aXRsZShzYW1wbGVfbWFpbikgKwogICAgZmFjZXRfZ3JpZChjb2xzPXZhcnMocGF0aWVudCkpCmRpdl9wCmBgYApgYGB7ciBpbmNsdWRlID0gRkFMU0V9Cmdnc2F2ZShwbG90PWRpdl9wLCBmaWxlbmFtZT1wYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9wYXRpZW50X2dyaWQucG5nIiksIGRldmljZT0icG5nIiwgd2lkdGggPSAyNSwgaGVpZ2h0ID0gNiwgdW5pdHM9ImNtIikKZ2dzYXZlKHBsb3Q9ZGl2X3AsIGZpbGVuYW1lPXBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3BhdGllbnRfZ3JpZC5wZGYiKSwgZGV2aWNlPSJwZGYiLCB3aWR0aCA9IDI1LCBoZWlnaHQgPSA2LCB1bml0cz0iY20iKQpgYGAKCiMjIyBDbG9uYWwgZGl2ZXJzaXR5IGF0IHNwZWNpZmljIHEgdmFsdWVzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKIyMjIyBxPTEgey19CgpgYGB7ciBjbG9uYWxfZGl2ZXJzaXR5X3ExLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD01LCBlY2hvID0gRkFMU0V9CnNhbXBsZV9kaXZAZGl2ZXJzaXR5JHRpbWVfcG9pbnQgPC0gZmFjdG9yKHNhbXBsZV9kaXZAZGl2ZXJzaXR5JHRpbWVfcG9pbnQsIGxldmVscz1jKCJiYXNlbGluZSIsIjZtb250aHMiLCIxMm1vbnRocyIpKQpzYW1wbGVfZGl2X3ExIDwtIHNhbXBsZV9kaXZAZGl2ZXJzaXR5W3doaWNoKHNhbXBsZV9kaXZAZGl2ZXJzaXR5JHEgPT0gMSksXQpzYW1wbGVfbWFpbiA8LSBwYXN0ZTAoIlNhbXBsZSBkaXZlcnNpdHkgYXQgcT0xIChOPSIsIHNhbXBsZV9kaXZAblsxXSwgIikiKQpkb2RnZSA8LSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSkKZHExIDwtIGdncGxvdChzYW1wbGVfZGl2X3ExLCBhZXMoeT1kLCB4PXRpbWVfcG9pbnQpKSArCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvcj1wYXRpZW50LGdyb3VwPXRpbWVfcG9pbnQpLHBvc2l0aW9uPWRvZGdlLCBzdGF0PSJpZGVudGl0eSIsIHNpemUgPSAzKSArCiAgICAjZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1kLWRfc2QsIHltYXg9ZCtkX3NkKSwgd2lkdGggPSAuMDUsIHBvc2l0aW9uPWRvZGdlKSArCiAgICBnZW9tX2xpbmUoYWVzKGdyb3VwPXBhdGllbnQsY29sb3I9cGF0aWVudCkpICsKICAgIHhsYWIoIiIpICsgeWxhYigiRGl2ZXJzaXR5IChxPTEpIikgKwogICAgZ2d0aXRsZShzYW1wbGVfbWFpbikgKwogICAgc2NhbGVfY29sb3VyX2JyZXdlcihwYWxldHRlID0gIkFjY2VudCIpKwogICAgI2ZhY2V0X2dyaWQoY29scz12YXJzKHBhdGllbnQpLCBkcm9wPVQsIHNwYWNlPSJmcmVlIiwgc2NhbGVzID0gImZyZWUiKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQpkcTEKYGBgCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9Cmdnc2F2ZShwbG90ID0gZHExLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3ExX3Rlc3Rfc3ViamVjdF9wYWlyZWQucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDUsIGhlaWdodCA9IDQsIHVuaXRzPSJjbSIpCmdnc2F2ZShwbG90ID0gZHExLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3ExX3Rlc3Rfc3ViamVjdF9wYWlyZWQucGRmIiksIGRldmljZT0icGRmIiwKICAgICAgICB3aWR0aCA9IDUsIGhlaWdodCA9IDQsIHVuaXRzPSJjbSIpCmBgYAoKIyMjIyBxPTAgey19CgpgYGB7ciBjbG9uYWxfZGl2ZXJzaXR5X3EwLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD01LCBlY2hvID0gRkFMU0V9CnNhbXBsZV9kaXZfcTAgPC0gc2FtcGxlX2RpdkBkaXZlcnNpdHlbd2hpY2goc2FtcGxlX2RpdkBkaXZlcnNpdHkkcSA9PSAwKSxdCnNhbXBsZV9tYWluIDwtIHBhc3RlMCgiU2FtcGxlIGRpdmVyc2l0eSBhdCBxPTAgKE49Iiwgc2FtcGxlX2RpdkBuWzFdLCAiKSIpCmRvZGdlIDwtIHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KQpkcTAgPC0gZ2dwbG90KHNhbXBsZV9kaXZfcTAsIGFlcyh5PWQsIHg9dGltZV9wb2ludCkpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yPXBhdGllbnQsZ3JvdXA9dGltZV9wb2ludCkscG9zaXRpb249ZG9kZ2UsIHN0YXQ9ImlkZW50aXR5Iiwgc2l6ZSA9IDMpICsKICAgICNnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWQtZF9zZCwgeW1heD1kK2Rfc2QpLCB3aWR0aCA9IC4wNSwgcG9zaXRpb249ZG9kZ2UpICsKICAgIGdlb21fbGluZShhZXMoZ3JvdXA9cGF0aWVudCxjb2xvcj1wYXRpZW50KSkgKwogICAgeGxhYigiIikgKyB5bGFiKCJEaXZlcnNpdHkgKHE9MCkiKSArCiAgICBnZ3RpdGxlKHNhbXBsZV9tYWluKSArCiAgICBzY2FsZV9jb2xvdXJfYnJld2VyKHBhbGV0dGUgPSAiQWNjZW50IikrCiAgICAjZmFjZXRfZ3JpZChjb2xzPXZhcnMocGF0aWVudCksIGRyb3A9VCwgc3BhY2U9ImZyZWUiLCBzY2FsZXMgPSAiZnJlZSIpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCmRxMApgYGAKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9Cmdnc2F2ZShwbG90ID0gZHEwLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3EwX3Rlc3Rfc3ViamVjdF9wYWlyZWQucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDI1LCBoZWlnaHQgPSA2LCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdCA9IGRxMCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9xMF90ZXN0X3N1YmplY3RfcGFpcmVkLnBkZiIpLCBkZXZpY2U9InBkZiIsCiAgICAgICAgd2lkdGggPSAyNSwgaGVpZ2h0ID0gNiwgdW5pdHM9ImNtIikKYGBgCgojIyBDbG9uYWwgZGl2ZXJzaXR5IHBlciBjZWxsIHBvcHVsYXRpb24KCmBgYHtyIGNsb25hbF9kaXZlcnNpdHlfcG9wLCBmaWcud2lkdGg9MTIsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRX0Kc2FtcGxlX2Rpdl9wb3AgPC0gYWxwaGFEaXZlcnNpdHkoYWJ1bmRfcG9wLCBncm91cD0ic2FtcGxlX3BvcCIsIG1pbl9xPTAsIG1heF9xPTQsIHN0ZXBfcT0wLjA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpPTAuOTUsIG5ib290PW5ib290KQpzYW1wbGVfbWFpbiA8LSBwYXN0ZTAoIlNhbXBsZSBkaXZlcnNpdHkgKE49Iiwgc2FtcGxlX2Rpdl9wb3BAblsxXSwgIikiKQpzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkdHJlYXRtZW50IDwtIHNhcHBseShzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMV0pCnNhbXBsZV9kaXZfcG9wQGRpdmVyc2l0eSR0aW1lX3BvaW50IDwtIHNhcHBseShzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMl0pCnNhbXBsZV9kaXZfcG9wQGRpdmVyc2l0eSRwYXRpZW50IDwtIHNhcHBseShzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbM10pCnNhbXBsZV9kaXZfcG9wQGRpdmVyc2l0eSRwb3B1bGF0aW9uIDwtIHNhcHBseShzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbNF0pCmRpdl9wb3AgPC0gZ2dwbG90KHNhbXBsZV9kaXZfcG9wQGRpdmVyc2l0eSwgYWVzKHggPSBxLCB5ID0gZCwgZ3JvdXAgPSBzYW1wbGVfcG9wKSkgKwogICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBkX2xvd2VyLAogICAgICAgICAgICAgICAgICAgIHltYXggPSBkX3VwcGVyLCBmaWxsID0gdGltZV9wb2ludCksIGFscGhhID0gMC40KSArCiAgICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gdGltZV9wb2ludCkpICsKICAgIHhsYWIoInEiKSArIHlsYWIoZXhwcmVzc2lvbigiIl5xICogRCkpICsKICAgIGdndGl0bGUoc2FtcGxlX21haW4pICsKICAgIGZhY2V0X2dyaWQoY29scz12YXJzKHBhdGllbnQpLCByb3dzPXZhcnMocG9wdWxhdGlvbiksIHNjYWxlcz0iZnJlZSIsIGRyb3AgPSBUKQpkaXZfcG9wCmBgYAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9Cmdnc2F2ZShwbG90ID0gZGl2X3BvcCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9zdWJqZWN0X3BvcHVsYXRpb24uc3ZnIiksIGRldmljZT0ic3ZnIiwKICAgICAgICB3aWR0aCA9IDI3LCBoZWlnaHQgPSAyMCwgdW5pdHM9ImNtIikKZ2dzYXZlKHBsb3QgPSBkaXZfcG9wLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3N1YmplY3RfcG9wdWxhdGlvbi5wZGYiKSwgZGV2aWNlPSJwZGYiLAogICAgICAgIHdpZHRoID0gMjcsIGhlaWdodCA9IDIwLCB1bml0cz0iY20iKQpgYGAKCiMjIyBDbG9uYWwgZGl2ZXJzaXR5IHBlciBwb3B1bGF0aW9uIGF0IHNwZWNpZmljIHEgdmFsdWVzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKIyMjIyBxPTEgey19CgpgYGB7ciBjbG9uYWxfZGl2ZXJzaXR5X3ExX3BvcCwgZWNobyA9IEZBTFNFfQpzYW1wbGVfZGl2X3ExIDwtIHNhbXBsZV9kaXZfcG9wQGRpdmVyc2l0eVt3aGljaChzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkcSA9PSAxKSxdCnNhbXBsZV9tYWluIDwtIHBhc3RlMCgiU2FtcGxlIGRpdmVyc2l0eSBhdCBxPTEgKE49Iiwgc2FtcGxlX2Rpdl9wb3BAblsxXSwgIikiKQpkb2RnZSA8LSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSkKZHExX3BvcCA8LSBnZ3Bsb3Qoc2FtcGxlX2Rpdl9xMSwgYWVzKHk9ZCwgeD10aW1lX3BvaW50KSkgKwogICAgZ2VvbV9wb2ludChwb3NpdGlvbj1kb2RnZSwgc3RhdD0iaWRlbnRpdHkiLCBzaXplID0gMykgKwogICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1kLWRfc2QsIHltYXg9ZCtkX3NkKSwgd2lkdGggPSAuMiwgcG9zaXRpb249ZG9kZ2UpICsKICAgIHhsYWIoIiIpICsgeWxhYigiRGl2ZXJzaXR5IChxPTEpIikgKwogICAgZ2d0aXRsZShzYW1wbGVfbWFpbikgKwogICAgZmFjZXRfZ3JpZChjb2xzPXZhcnMocGF0aWVudCksIHJvd3M9dmFycyhwb3B1bGF0aW9uKSwgZHJvcD1ULCBzY2FsZXMgPSAiZnJlZSIpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCmRxMV9wb3AKYGBgCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9Cmdnc2F2ZShwbG90ID0gZHExX3BvcCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9xMV90ZXN0X3BvcHVsYXRpb24ucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPSAxNSwgdW5pdHM9ImNtIikKZ2dzYXZlKHBsb3QgPSBkcTFfcG9wLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3ExX3Rlc3RfcG9wdWxhdGlvbi5wZGYiKSwgZGV2aWNlPSJwZGYiLAogICAgICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDE1LCB1bml0cz0iY20iKQpgYGAKCiMjIyMgcT0wIHstfQoKYGBge3IgY2xvbmFsX2RpdmVyc2l0eV9xMF9wb3AsIGVjaG8gPSBGQUxTRX0Kc2FtcGxlX2Rpdl9xMCA8LSBzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHlbd2hpY2goc2FtcGxlX2Rpdl9wb3BAZGl2ZXJzaXR5JHEgPT0gMCksXQpzYW1wbGVfbWFpbiA8LSBwYXN0ZTAoIlNhbXBsZSBkaXZlcnNpdHkgYXQgcT0wIChOPSIsIHNhbXBsZV9kaXZfcG9wQG5bMV0sICIpIikKZG9kZ2UgPC0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpCmRxMF9wb3AgPC0gZ2dwbG90KHNhbXBsZV9kaXZfcTAsIGFlcyh5PWQsIHg9dGltZV9wb2ludCkpICsKICAgIGdlb21fcG9pbnQocG9zaXRpb249ZG9kZ2UsIHN0YXQ9ImlkZW50aXR5Iiwgc2l6ZSA9IDMpICsKICAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW49ZC1kX3NkLCB5bWF4PWQrZF9zZCksIHdpZHRoID0gLjIsIHBvc2l0aW9uPWRvZGdlKSArCiAgICB4bGFiKCIiKSArIHlsYWIoIkRpdmVyc2l0eSAocT0wKSIpICsKICAgIGdndGl0bGUoc2FtcGxlX21haW4pICsKICAgIGZhY2V0X2dyaWQoY29scz12YXJzKHBhdGllbnQpLCByb3dzPXZhcnMocG9wdWxhdGlvbiksIGRyb3A9VCwgc2NhbGVzID0gImZyZWUiKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQpkcTBfcG9wCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0KZ2dzYXZlKHBsb3QgPSBkcTBfcG9wLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3EwX3Rlc3RfcG9wdWxhdGlvbi5wbmciKSwgZGV2aWNlPSJwbmciLAogICAgICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDE1LCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdCA9IGRxMF9wb3AsIGZpbGVuYW1lID0gcGFzdGUwKGRpdmVyc2l0eV9kaXIsIi9EaXZlcnNpdHlfcTBfdGVzdF9wb3B1bGF0aW9uLnBkZiIpLCBkZXZpY2U9InBkZiIsCiAgICAgICAgd2lkdGggPSAyMCwgaGVpZ2h0ID0gMTUsIHVuaXRzPSJjbSIpCmBgYAoKIyBWIGdlbmUgdXNhZ2UKCiMjIFYgZ2VuZSBmYW1pbHkgdXNhZ2Ugey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgpUaGUgViBnZW5lIHVzYWdlIChpbiBwZXJjZW50YWdlKSBpbiBlYWNoIG9mIHRoZSBzYW1wbGVzIGlzIHJlcHJlc2VudGVkIGJlbG93LiBBbGwgcGxvdHMgYW5kIHRhYmxlcyBjYW4gYmUgZm91bmQgW2hlcmVdKC4vcmVwZXJ0b2lyZV9jb21wYXJpc29uL1ZfZmFtaWx5LykuCgpHZW5lIGZhbWlseSB1c2FnZSBpcyBub3JtYWxpemVkIGJ5IHRoZSBudW1iZXIgb2YgY2xvbmVzLgoKIyMjIEJ5IHBhdGllbnQgey19CgpgYGB7ciwgZWNobz1GLGZpZy53aWR0aD02LCBmaWcuYXNwPTEsIGZpZy5hbGlnbj0nY2VudGVyJ30KZmFtaWx5IDwtIGNvdW50R2VuZXMoZGZfYWxsLCBnZW5lPSJ2X2NhbGwiLCBncm91cHM9InNhbXBsZSIsIG1vZGU9ImZhbWlseSIsIGNsb25lPSJjbG9uZV9pZCIpCmZhbWlseSR0cmVhdG1lbnQgPC0gc2FwcGx5KGZhbWlseSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzFdKQpmYW1pbHkkdGltZV9wb2ludCA8LSBzYXBwbHkoZmFtaWx5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMl0pCmZhbWlseSR0aW1lX3BvaW50IDwtIGZhY3RvcihmYW1pbHkkdGltZV9wb2ludCwgbGV2ZWxzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIikpCmZhbWlseSRwYXRpZW50IDwtIHNhcHBseShmYW1pbHkkc2FtcGxlLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVszXSkKCmdnMSA8LSBnZ3Bsb3QoZmFtaWx5LCBhZXMoZmlsbD1nZW5lLCB5PWNsb25lX2ZyZXEsIHg9dGltZV9wb2ludCkpICsgCiAgICAgICAgZ2VvbV9iYXIocG9zaXRpb249ImZpbGwiLCBzdGF0PSJpZGVudGl0eSIpICsKICAgICAgICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKHBhdGllbnQpLCBkcm9wPVQsIHNjYWxlcyA9ICJmcmVlIiApICsKICAgICAgICAgICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xLCB2anVzdD0xKSkKCgpnMiA8LSBnZ3Bsb3QoZmFtaWx5LCBhZXMoeD10aW1lX3BvaW50LCB5PWNsb25lX2ZyZXEsIGZpbGw9dGltZV9wb2ludCkpICsKICAgIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgICBnZ3RpdGxlKCJWIEdlbmUgRmFtaWx5IFVzYWdlIikgKwogICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xLCB2anVzdD0xKSkgKwogICAgeWxhYigiRnJlcXVlbmN5IikgKwogICAgeGxhYigiIikgKwogICAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhwYXRpZW50KSwgcm93cz12YXJzKGdlbmUpLGRyb3A9VCwgc2NhbGVzID0gImZyZWUiICkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJCbHVlcyIpCmdnMQpnMgpgYGAKCmBgYHtyLCBlY2hvPUZ9Cmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwgIi9WX0ZhbWlseV9kaXN0cmlidXRpb25fcGF0aWVudC5zdmciKSwgcGxvdCA9IGcyLCB3aWR0aCA9IDI1LCBoZWlnaHQgPSA2LCB1bml0cyA9ICJjbSIpCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwgIi9WX0ZhbWlseV9kaXN0cmlidXRpb25fcGF0aWVudC5wbmciKSwgcGxvdCA9IGcyLCB3aWR0aCA9IDI1LCBoZWlnaHQgPSA2LCB1bml0cyA9ICJjbSIpCndyaXRlLnRhYmxlKGZhbWlseSwgZmlsZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwgIi9WX2ZhbWlseV9kaXN0cmlidXRpb25fZGF0YS50c3YiKSwgc2VwID0gIlx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQpgYGAKCmBgYHtyLCBlY2hvPUYsZmlnLndpZHRoPTMsIGZpZy5hc3A9MS41LCBmaWcuYWxpZ249J2NlbnRlcid9CmRvZGdlIDwtIHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KQpnMyA8LSBnZ3Bsb3QoZmFtaWx5LCBhZXMoeD10aW1lX3BvaW50LCB5PWNsb25lX2ZyZXEpKSArCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvcj1wYXRpZW50LCBncm91cD10aW1lX3BvaW50KSxwb3NpdGlvbiA9ZG9kZ2UsIHN0YXQ9ImlkZW50aXR5Iiwgc2l6ZT0zKSArCiAgICBnZW9tX2xpbmUoYWVzKGdyb3VwPXBhdGllbnQsY29sb3I9cGF0aWVudCkpICsKICAgIGdndGl0bGUoIlYgR2VuZSBGYW1pbHkgVXNhZ2UiKSArCiAgICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0PTEsIHZqdXN0PTEpKSArCiAgICB5bGFiKCJGcmVxdWVuY3kiKSArCiAgICB4bGFiKCIiKSArCiAgICBmYWNldF9ncmlkKHJvd3M9dmFycyhnZW5lKSxkcm9wPVQsIHNjYWxlcyA9ICJmcmVlIiApICsKICAgICN0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgIHNjYWxlX2NvbG91cl9icmV3ZXIocGFsZXR0ZT0iQWNjZW50IikKZzMKYGBgCgojIyMgQnkgUG9wdWxhdGlvbiB7LX0KCmBgYHtyLCBlY2hvPUYsIGZpZy53aWR0aD0xMCwgZmlnLmFzcD0wLjUsIGZpZy5hbGlnbj0nY2VudGVyJ30KZmFtaWx5IDwtIGNvdW50R2VuZXMoZGZfYWxsLCBnZW5lPSJ2X2NhbGwiLCBncm91cHM9InNhbXBsZV9wb3AiLAogICAgICAgICAgICAgICAgICAgIG1vZGU9ImZhbWlseSIsIGNsb25lID0gImNsb25lX2lkIikKZmFtaWx5JHRyZWF0bWVudCA8LSBzYXBwbHkoZmFtaWx5JHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzFdKQpmYW1pbHkkdGltZV9wb2ludCA8LSBzYXBwbHkoZmFtaWx5JHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzJdKQpmYW1pbHkkcGF0aWVudCA8LSBzYXBwbHkoZmFtaWx5JHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzNdKQpmYW1pbHkkcG9wdWxhdGlvbiA8LSBzYXBwbHkoZmFtaWx5JHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzRdKQpnMiA8LSBnZ3Bsb3QoZmFtaWx5LCBhZXMoeD10aW1lX3BvaW50LCB5PWNsb25lX2ZyZXEsIGZpbGw9Z2VuZSkpICsKICAgIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTZXQxIikgKwogICAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKICAgIGdndGl0bGUoIlYgZ2VuZSBGYW1pbHkgVXNhZ2UiKSArCiAgICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0PTEsIHZqdXN0PTEpKSArCiAgICB5bGFiKCJGcmVxdWVuY3kiKSArCiAgICB4bGFiKCIiKSArCiAgICBmYWNldF9ncmlkKGNvbHM9dmFycyhwYXRpZW50LHBvcHVsYXRpb24pLCByb3dzPXZhcnMoZ2VuZSkpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKZzIKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKHZmYW1pbHlfZGlyLCIvVl9GYW1pbHlfZGlzdHJpYnV0aW9uX3BhdGllbnRfcG9wdWxhdGlvbi5zdmciKSwgcGxvdCA9IGcyLAogICAgd2lkdGggPSAzMCwgaGVpZ2h0ID0gMjAsIHVuaXRzID0gImNtIikKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKHZmYW1pbHlfZGlyLCIvVl9GYW1pbHlfZGlzdHJpYnV0aW9uX3BhdGllbnRfcG9wdWxhdGlvbi5wbmciKSwgcGxvdCA9IGcyLAogICAgd2lkdGggPSAzMCwgaGVpZ2h0ID0gMjAsIHVuaXRzID0gImNtIikKd3JpdGUudGFibGUoZmFtaWx5LCBmaWxlID0gcGFzdGUwKHZmYW1pbHlfZGlyLCAiL1ZfZmFtaWx5X2Rpc3RyaWJ1dGlvbl9kYXRhX3BvcHVsYXRpb24udHN2IiksIHNlcCA9ICJcdCIsCiAgICBxdW90ZSA9IEYsIHJvdy5uYW1lcyA9IEYpCmBgYAoKIyMgViBnZW5lIHVzYWdlIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKVGhlIFYgZ2VuZSB1c2FnZSAoaW4gcGVyY2VudGFnZSkgaW4gZWFjaCBvZiB0aGUgc2FtcGxlcyBpcyByZXByZXNlbnRlZCBiZWxvdy4KQWxsIHBsb3RzIGFuZCB0YWJsZXMgY2FuIGJlIGZvdW5kIFtoZXJlXSguL3JlcGVydG9pcmVfY29tcGFyaXNvbi9WX2ZhbWlseS8pLgoKIyMjIEJ5IGNsb25lcyB7LX0KCmBgYHtyLCBlY2hvPUYsIGZpZy53aWR0aD0xMCwgZmlnLmFzcD0xLjgsIGZpZy5hbGlnbj0nY2VudGVyJ30KZmFtaWx5IDwtIGNvdW50R2VuZXMoZGZfYWxsLCBnZW5lPSJ2X2NhbGwiLCBncm91cHM9InNhbXBsZSIsIG1vZGU9ImdlbmUiLCBjbG9uZSA9ICJjbG9uZV9pZCIpCmZhbWlseSR0cmVhdG1lbnQgPC0gc2FwcGx5KGZhbWlseSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzFdKQpmYW1pbHkkdGltZV9wb2ludCA8LSBzYXBwbHkoZmFtaWx5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMl0pCmZhbWlseSRwYXRpZW50IDwtIHNhcHBseShmYW1pbHkkc2FtcGxlLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVszXSkKZzIgPC0gZ2dwbG90KGZhbWlseSwgYWVzKHg9Z2VuZSwgeT1jbG9uZV9mcmVxLCBmaWxsPWdlbmUpKSArCiAgICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iU2V0MSIpICsKICAgIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgICBnZ3RpdGxlKCJWIEdlbmUgRmFtaWx5IFVzYWdlIikgKwogICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xLCB2anVzdD0xKSkgKwogICAgeWxhYigiRnJlcXVlbmN5IikgKwogICAgeGxhYigiIikgKwogICAgZmFjZXRfd3JhcCh2YXJzKHBhdGllbnQpLCBzY2FsZXM9ImZyZWVfeCIsIG5jb2wgPSAxKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmcyCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwgIi9WX2dlbmVfZGlzdHJpYnV0aW9uX2J5X2Nsb25lX3BhdGllbnQuc3ZnIiksIHBsb3QgPSBnMiwgd2lkdGggPSAyMCwgaGVpZ2h0ID0gNDAsIHVuaXRzID0gImNtIikKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKHZmYW1pbHlfZGlyLCAiL1ZfZ2VuZV9kaXN0cmlidXRpb25fYnlfY2xvbmVfcGF0aWVudC5wbmciKSwgcGxvdCA9IGcyLCB3aWR0aCA9IDIwLCBoZWlnaHQgPSA0MCwgdW5pdHMgPSAiY20iKQp3cml0ZS50YWJsZShmYW1pbHksIGZpbGUgPSBwYXN0ZTAodmZhbWlseV9kaXIsICIvVl9nZW5lX2Rpc3RyaWJ1dGlvbl9ieV9jbG9uZV9kYXRhLnRzdiIpLCBzZXAgPSAiXHQiLCBxdW90ZSA9IEYsIHJvdy5uYW1lcyA9IEYpCmBgYAoKIyMjIEJ5IHNlcXVlbmNlcyB7LX0KCmBgYHtyLCBlY2hvPUYsIGZpZy53aWR0aD0xMCwgZmlnLmFzcD0xLjgsIGZpZy5hbGlnbj0nY2VudGVyJ30KZmFtaWx5IDwtIGNvdW50R2VuZXMoZGZfYWxsLCBnZW5lPSJ2X2NhbGwiLCBncm91cHM9InNhbXBsZSIsIG1vZGU9ImdlbmUiKQpmYW1pbHkkdHJlYXRtZW50IDwtIHNhcHBseShmYW1pbHkkc2FtcGxlLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsxXSkKZmFtaWx5JHRpbWVfcG9pbnQgPC0gc2FwcGx5KGZhbWlseSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzJdKQpmYW1pbHkkcGF0aWVudCA8LSBzYXBwbHkoZmFtaWx5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbM10pCmcyIDwtIGdncGxvdChmYW1pbHksIGFlcyh4PWdlbmUsIHk9c2VxX2ZyZXEsIGZpbGw9Z2VuZSkpICsKICAgIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTZXQxIikgKwogICAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKICAgIGdndGl0bGUoIlYgR2VuZSBVc2FnZSIpICsKICAgIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSwgdmp1c3Q9MSkpICsKICAgIHlsYWIoIkZyZXF1ZW5jeSIpICsKICAgIHhsYWIoIiIpICsKICAgIGZhY2V0X3dyYXAodmFycyhwYXRpZW50KSwgc2NhbGVzPSJmcmVlX3giLCBuY29sID0gMSkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpnMgpnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAodmZhbWlseV9kaXIsICIvVl9nZW5lX2Rpc3RyaWJ1dGlvbl9ieV9zZXF1ZW5jZV9wYXRpZW50LnN2ZyIpLCBwbG90ID0gZzIsIHdpZHRoID0gMjAsIGhlaWdodCA9IDQwLCB1bml0cyA9ICJjbSIpCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwgIi9WX2dlbmVfZGlzdHJpYnV0aW9uX2J5X3NlcXVlbmNlX3BhdGllbnQucG5nIiksIHBsb3QgPSBnMiwgd2lkdGggPSAyMCwgaGVpZ2h0ID0gNDAsIHVuaXRzID0gImNtIikKd3JpdGUudGFibGUoZmFtaWx5LCBmaWxlID0gcGFzdGUwKHZmYW1pbHlfZGlyLCAiL1ZfZ2VuZV9kaXN0cmlidXRpb25fYnlfc2VxdWVuY2VfZGF0YS50c3YiKSwgc2VwID0gIlx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQpgYGAKCiMgSXNvdHlwZSB1c2FnZQoKIyMgSXNvdHlwZSB1c2FnZSBwZXIgc3ViamVjdAoKYGBge3IgaXNvdHlwZV91c2FnZSwgZWNobz1GLCBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC4zLCBmaWcuYWxpZ249J2NlbnRlcid9CiMgUGxvdHRpbmcgSXNvdHlwZSBwZXJjZW50YWdlcyBwZXIgcGF0aWVudApkZl9hbGwkaXNvdHlwZSA8LSBkZl9hbGwkY19wcmltZXIKCnJlcyA8LSBkZl9hbGwgJT4lIGdyb3VwX2J5KGlzb3R5cGUsc2FtcGxlLHNvdXJjZSx0cmVhdG1lbnQsZXh0cmFjdF90aW1lKSAlPiUgZHBseXI6OnN1bW1hcmlzZShTZXFzX2lzb3R5cGU9bigpKQpyZXMgPC0gd2l0aChyZXMsIHJlc1tvcmRlcihzb3VyY2UpLF0pCnJlc19zYW1wbGUgPC0gZGZfYWxsICU+JSBncm91cF9ieShzYW1wbGUpICU+JSBkcGx5cjo6c3VtbWFyaXNlKFNlcXNfdG90YWw9bigpKQoKZnJlcXMgPC0gbWVyZ2UoeD1yZXMsIHk9cmVzX3NhbXBsZSwgYWxsLnggPSBULCBieS54ID0gInNhbXBsZSIsIGJ5LnkgPSAic2FtcGxlIikKZnJlcXMkRnJlcSA8LSAoZnJlcXMkU2Vxc19pc290eXBlL2ZyZXFzJFNlcXNfdG90YWwpCgpnNCA8LSBnZ3Bsb3QoZnJlcXMsIGFlcyhmaWxsPWV4dHJhY3RfdGltZSwgeT1GcmVxLCB4PWlzb3R5cGUpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKICB4bGFiKCIiKSArCiAgeWxhYigiRnJlcXVlbmN5IikgKwogIGdndGl0bGUoIklzb3R5cGUgZnJlcXVlbmN5IikgKwogIGZhY2V0X2dyaWQoY29scz12YXJzKHNvdXJjZSksIHNjYWxlcyA9ICJmcmVlIiwgZHJvcCA9IFQpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQpnNApnZ3NhdmUocGxvdD1nNCwgZmlsZW5hbWUgPSBwYXN0ZTAoaXNvdHlwZV9kaXIsIi9Jc290eXBlX2ZyZXF1ZW5jaWVzX3BhdGllbnQuc3ZnIiksIGRldmljZSA9ICJzdmciLAogIHdpZHRoID0gMjUsIGhlaWdodCA9IDcsIHVuaXRzID0gImNtIikKZ2dzYXZlKHBsb3Q9ZzQsIGZpbGVuYW1lID0gcGFzdGUwKGlzb3R5cGVfZGlyLCIvSXNvdHlwZV9mcmVxdWVuY2llc19wYXRpZW50LnBkZiIpLCBkZXZpY2UgPSAicGRmIiwKICB3aWR0aCA9IDI1LCBoZWlnaHQgPSA3LCB1bml0cyA9ICJjbSIpCndyaXRlLnRhYmxlKGZyZXFzLCBmaWxlID0gcGFzdGUwKGlzb3R5cGVfZGlyLCIvSXNvdHlwZV9mcmVxdWVuY2llc19kYXRhLnRzdiIpLCBzZXA9Ilx0IiwgcXVvdGU9Riwgcm93Lm5hbWVzID0gRikKCmBgYAoKIyMgSXNvdHlwZSB1c2FnZSBwZXIgY2VsbCBwb3B1bGF0aW9uCgpgYGB7ciBpc290eXBlX3BvcCwgZWNobz1GLCBmaWcud2lkdGg9MTUsIGZpZy5hc3A9MSwgZmlnLmFsaWduPSdjZW50ZXInfQpyZXMgPC0gZGZfYWxsICU+JSBncm91cF9ieShpc290eXBlLCBzYW1wbGVfcG9wLCBzb3VyY2UsIHRyZWF0bWVudCwgZXh0cmFjdF90aW1lLCBwb3B1bGF0aW9uKSAlPiUgZHBseXI6OnN1bW1hcmlzZShTZXFzX2lzb3R5cGU9bigpKQpyZXMgPC0gd2l0aChyZXMsIHJlc1tvcmRlcihzb3VyY2UpLF0pCnJlc19zYW1wbGUgPC0gZGZfYWxsICU+JSBncm91cF9ieShzYW1wbGVfcG9wKSAlPiUgZHBseXI6OnN1bW1hcmlzZShTZXFzX3RvdGFsPW4oKSkKCmZyZXFzIDwtIG1lcmdlKHg9cmVzLCB5PXJlc19zYW1wbGUsIGFsbC54ID0gVCwgYnkueCA9ICJzYW1wbGVfcG9wIiwgYnkueSA9ICJzYW1wbGVfcG9wIikKZnJlcXMkRnJlcSA8LSAoZnJlcXMkU2Vxc19pc290eXBlL2ZyZXFzJFNlcXNfdG90YWwpCgpnNCA8LSBnZ3Bsb3QoZnJlcXMsIGFlcyhmaWxsPWV4dHJhY3RfdGltZSwgeT1GcmVxLCB4PWlzb3R5cGUpKSArCiBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQ9ImlkZW50aXR5IikgKwogeGxhYigiIikgKwogeWxhYigiRnJlcXVlbmN5IikgKwogZ2d0aXRsZSgiSXNvdHlwZSBmcmVxdWVuY3kiKSArCiBmYWNldF9ncmlkKGNvbHM9dmFycyhzb3VyY2UpLCByb3dzPXZhcnMocG9wdWxhdGlvbikpICsKIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmc0Cmdnc2F2ZShnNCwgZmlsZW5hbWUgPSBwYXN0ZTAoaXNvdHlwZV9kaXIsIi9Jc290eXBlX3BlcmNlbnRhZ2VzX2NlbGxfcG9wdWxhdGlvbi5zdmciKSwgZGV2aWNlID0gInN2ZyIsCiAgd2lkdGggPSAyNSwgaGVpZ2h0ID0gMjAsIHVuaXRzID0gImNtIikKZ2dzYXZlKGc0LCBmaWxlbmFtZSA9IHBhc3RlMChpc290eXBlX2RpciwiL0lzb3R5cGVfcGVyY2VudGFnZXNfY2VsbF9wb3B1bGF0aW9uLnBkZiIpLCBkZXZpY2UgPSAicGRmIiwKICB3aWR0aCA9IDI1LCBoZWlnaHQgPSAyMCwgdW5pdHMgPSAiY20iKQoKd3JpdGUudGFibGUoZnJlcXMsIGZpbGUgPSBwYXN0ZTAoaXNvdHlwZV9kaXIsICIvSXNvdHlwZV9mcmVxdWVuY2llc19jZWxsX3BvcHVsYXRpb25fZGF0YS50c3YiKSwgc2VwPSJcdCIsIHF1b3RlID0gRiwgcm93Lm5hbWVzID0gRikKYGBgCgojIENsb25hbCBvdmVybGFwIGFuYWx5c2lzCgpgYGB7ciBjbG9uYWxfb3ZlcmxhcCwgZWNobz1GLCBmaWcuYWxpZ249J2NlbnRlcid9CiMgIyBTcGxpdHRpbmcgZGF0YSBpbiBhIHBlciBwYXRpZW50IGJhc2lzCmRmX3N1YnNldCA8LSBkZl9hbGxbLGMoInRyZWF0bWVudCIsICJleHRyYWN0X3RpbWUiLCAic291cmNlIiwgInBvcHVsYXRpb24iLCAKICAgICAgICAgICAgICAgICAgICAgICJjbG9uZV9pZCIsIAogICAgICAgICAgICAgICAgICAgICAgInZfY2FsbCIsICJkX2NhbGwiLCAial9jYWxsIiwgImp1bmN0aW9uX2xlbmd0aCIsIAogICAgICAgICAgICAgICAgICAgICAgICJzYW1wbGUiLCAic2FtcGxlX3BvcCIpXQpkZl9wYXQgPC0gc3BsaXQoZGZfc3Vic2V0LCBkZl9zdWJzZXQkc291cmNlKQpkZl9wYXQkQ0xBRDQ8LU5VTEwKZGlyLmNyZWF0ZShwYXN0ZShvdXRkaXIsIkNsb25lX292ZXJsYXAiLCBzZXAgPSAiLyIpKQoKI2ZvciAoaSBpbiBjKDE6bGVuZ3RoKGRmX3BhdCkpKSB7CiAgICBwYXRkaXJfb3ZlcmxhcCA8LSBwYXN0ZShvdXRkaXIsIkNsb25lX292ZXJsYXAiLG5hbWVzKGRmX3BhdClbaV0sIHNlcD0iLyIpCiAgICBkaXIuY3JlYXRlKHBhdGRpcl9vdmVybGFwKQoKICAgIAogICAgIyMgUGxvdCBjaG9yZHBsb3QgY29tcGFyaXNvbiB0aW1lIHBvaW50cyBwZXIgcGF0aWVudAogICAgZGZfcGF0W1tpXV0kdGltZV9wb3AgPC0gYXMuZmFjdG9yKHBhc3RlKGRmX3BhdFtbaV1dJGV4dHJhY3RfdGltZSwgZGZfcGF0W1tpXV0kcG9wdWxhdGlvbiwgc2VwPSJfIikpCiAgICBkZl9wb3BfdGltZSA8LSBzcGxpdChkZl9wYXRbW2ldXSwgZGZfcGF0W1tpXV0kdGltZV9wb3ApCiAgCiAgICBjb3VudF9jbG9uZXMgPC0gY291bnRDbG9uZXMoZGZfcGF0W1tpXV0pCiAgCiAgICAjIyBDYWxjdWxhdGluZyBvdmVybGFwcyBiZXR3ZWVuIHRpbWUgcG9pbnRzCiAgICBjb21iaW4gPC0gZXhwYW5kLmdyaWQodW5pcXVlKGRmX3BhdFtbaV1dJGV4dHJhY3RfdGltZSksIHVuaXF1ZShkZl9wYXRbW2ldXSRwb3B1bGF0aW9uKSkKICAgIGNvbWJpbiRuYW1lcyA8LSBhcHBseShjb21iaW5bLGMoIlZhcjEiLCAiVmFyMiIpXSwgMSwgcGFzdGUsIGNvbGxhcHNlID0gIl8iKQogIAogICAgYmFzZWxpbmVzIDwtIHN1YnNldChjb21iaW4sIGNvbWJpbiRWYXIxID09ICJiYXNlbGluZSIpCiAgICBvdGhlciA8LSBzdWJzZXQoY29tYmluLCBjb21iaW4kVmFyMSAhPSAiYmFzZWxpbmUiKQogICAgY2xvbmVkZiA8LSBleHBhbmQuZ3JpZChiYXNlbGluZXMkbmFtZXMsIG90aGVyJG5hbWVzKQogICAgY29sbmFtZXMoY2xvbmVkZikgPC0gYygiZnJvbSIsInRvIikKICAgIHNlcWRmIDwtIGNsb25lZGYKICAKICAgIGxlbmludGVyc2VjdHMgPSBudW1lcmljKDApCiAgICBzZXFzaW50ZXJzZWN0cyA9IG51bWVyaWMoMCkKICAgIGZvciAoaiBpbiBjKDE6bnJvdyhjbG9uZWRmKSkpewogICAgICAgIGludGVyIDwtIGludGVyc2VjdChkZl9wb3BfdGltZVtbd2hpY2goZ3JlcGwoY2xvbmVkZltqLDFdLCBuYW1lcyhkZl9wb3BfdGltZSkpKV1dJGNsb25lX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZl9wb3BfdGltZVtbd2hpY2goZ3JlcGwoY2xvbmVkZltqLDJdLCBuYW1lcyhkZl9wb3BfdGltZSkpKV1dJGNsb25lX2lkKQogICAgCiAgICAgICAgY2xvbmVzX3N1YnNldCA8LSBjb3VudF9jbG9uZXNbd2hpY2goY291bnRfY2xvbmVzJGNsb25lX2lkICVpbiUgYXMuY2hhcmFjdGVyKGludGVyKSksXQogICAgCiAgICAgICAgbGVuaW50ZXJzZWN0cyA8LSBjKGxlbmludGVyc2VjdHMsIGxlbmd0aChpbnRlcikpCiAgICAgICAgc2Vxc2ludGVyc2VjdHMgPC0gYyhzZXFzaW50ZXJzZWN0cywgc3VtKGNsb25lc19zdWJzZXQkc2VxX2NvdW50KSkKICAgIH0KICAKICAgIGNsb25lZGYkdmFsdWUgPC0gbGVuaW50ZXJzZWN0cwogICAgc2VxZGYkdmFsdWUgPC0gc2Vxc2ludGVyc2VjdHMKICAKICAgICMgU2F2aW5nIGJvdGggdGFibGVzCiAgICB3cml0ZS50YWJsZShjbG9uZWRmLCBmaWxlID0gcGFzdGUocGF0ZGlyX292ZXJsYXAsIi9DbG9uZV9vdmVybGFwX2NvbXBhcmlzb25fdGltZV9wb2ludHNfIiwgZGZfcG9wX3RpbWVbWzFdXSR0cmVhdG1lbnRbMV0sICJfIiwgZGZfcG9wX3RpbWVbWzFdXSRzb3VyY2VbMV0sICIudHN2Iiwgc2VwPSIiKSwgc2VwID0gIlx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQogICAgd3JpdGUudGFibGUoc2VxZGYsIGZpbGUgPSBwYXN0ZShwYXRkaXJfb3ZlcmxhcCwiL0Nsb25lX3NlcU5fb3ZlcmxhcF9jb21wYXJpc29uX3RpbWVfcG9pbnRzXyIsIGRmX3BvcF90aW1lW1sxXV0kdHJlYXRtZW50WzFdLCAiXyIsIGRmX3BvcF90aW1lW1sxXV0kc291cmNlWzFdLCAiLnRzdiIsIHNlcD0iIiksIHNlcCA9ICJcdCIsIHF1b3RlID0gRiwgcm93Lm5hbWVzID0gRikKICAKICAgICNncmlkLmNvbCA9IGMoIiNhNmNlZTMiLCAiI2IyZGY4YSIsICIjZmI5YTk5IiwgIiNmZGJmNmYiLCAiIzFmNzhiNCIsICIjMzNhMDJjIiwgIiNlMzFhMWMiLCAiI2ZmN2YwMCIpCiAgICAjbmFtZXMoZ3JpZC5jb2wpIDwtIGNsb25lZGYkZnJvbQoKICAKICAgICMgQ2xvbmUgb3ZlcmxhcCBwbG90CiAgICBzdmcoZmlsZW5hbWUgPSBwYXN0ZShwYXRkaXJfb3ZlcmxhcCwiL0Nsb25lX292ZXJsYXBfY29tcGFyaXNvbl90aW1lX3BvaW50c18iLAogICAgICAgICAgICAgICAgICAgICAgICAgZGZfcG9wX3RpbWVbWzFdXSR0cmVhdG1lbnRbMV0sICJfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkZl9wb3BfdGltZVtbMV1dJHNvdXJjZVsxXSwgIi5zdmciLCBzZXA9IiIpKQogICAgICAgIGNob3JkRGlhZ3JhbShjbG9uZWRmLCAKICAgICAgICAgICAgICAgICBncmlkLmNvbCA9IGdyaWQuY29sLCAKICAgICAgICAgICAgICAgICBzZWxmLmxpbmsgPSAxLAogICAgICAgICAgICAgICAgIHRyYW5zcGFyZW5jeSA9IDAuMywKICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVHJhY2s9ImdyaWQiLAogICAgICAgICAgICAgICAgIHByZUFsbG9jYXRlVHJhY2tzID0gbGlzdCh0cmFjay5oZWlnaHQgPSBtYXgoc3Ryd2lkdGgodW5saXN0KGRpbW5hbWVzKGNsb25lZGYpKSkpKSkKICAgICAgICBjaXJjb3MudHJhY2sodHJhY2suaW5kZXggPSAxLCAKICAgICAgICAgICAgICAgICBwYW5lbC5mdW4gPSBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNvcy50ZXh0KENFTExfTUVUQSR4Y2VudGVyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VMTF9NRVRBJHlsaW1bMl0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRUxMX01FVEEkc2VjdG9yLmluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGogPSBjKDAsIDAuNSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGJnLmJvcmRlciA9IE5BKQogICAgICAgIHRpdGxlKHBhc3RlKCJjbG9uZSBvdmVybGFwIiwgZGZfcG9wX3RpbWVbWzFdXSR0cmVhdG1lbnRbMV0sIGRmX3BvcF90aW1lW1sxXV0kc291cmNlWzFdKSwgY2V4ID0gMC44KQogICAgICAgIGNpcmNvcy5jbGVhcigpCiAgICBkZXYub2ZmKCkKICAKICAgIHBuZyhmaWxlbmFtZSA9IHBhc3RlKHBhdGRpcl9vdmVybGFwLCAiL0Nsb25lX292ZXJsYXBfY29tcGFyaXNvbl90aW1lX3BvaW50c18iLCBkZl9wb3BfdGltZVtbMV1dJHRyZWF0bWVudFsxXSwgIl8iLCBkZl9wb3BfdGltZVtbMV1dJHNvdXJjZVsxXSwgIi5wbmciLCBzZXA9IiIpLCB3aWR0aD0xNSwgaGVpZ2h0PTE1LCB1bml0cyA9ICJjbSIsIHJlcyA9IDMwMCkKICAgIGNob3JkRGlhZ3JhbShjbG9uZWRmLCAKICAgICAgICAgICAgICAgICAjZ3JpZC5jb2wgPSBncmlkLmNvbCwgCiAgICAgICAgICAgICAgICAgc2VsZi5saW5rID0gMSwKICAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3kgPSAwLjMsCiAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblRyYWNrPSJncmlkIiwKICAgICAgICAgICAgICAgICBwcmVBbGxvY2F0ZVRyYWNrcyA9IGxpc3QodHJhY2suaGVpZ2h0ID0gbWF4KHN0cndpZHRoKHVubGlzdChkaW1uYW1lcyhjbG9uZWRmKSkpKSkpCiAgICBjaXJjb3MudHJhY2sodHJhY2suaW5kZXggPSAxLCBwYW5lbC5mdW4gPSBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGNpcmNvcy50ZXh0KENFTExfTUVUQSR4Y2VudGVyLCBDRUxMX01FVEEkeWxpbVsyXSwgQ0VMTF9NRVRBJHNlY3Rvci5pbmRleCwKICAgICAgICAgICAgICAgICAgYWRqID0gYygwLCAwLjUpKQogICAgfSwgYmcuYm9yZGVyID0gTkEpCiAgICB0aXRsZShwYXN0ZSgiY2xvbmVfaWQgT1ZFUkxBUCIsIGRmX3BvcF90aW1lW1sxXV0kdHJlYXRtZW50WzFdLCBkZl9wb3BfdGltZVtbMV1dJHNvdXJjZVsxXSksIGNleCA9IDAuOCkKICAgIGNpcmNvcy5jbGVhcigpCiAgICBkZXYub2ZmKCkKICAKICAgICMgU2VxdWVuY2VzIG92ZXJsYXAgcGxvdAogICAgc3ZnKGZpbGVuYW1lID0gcGFzdGUocGF0ZGlyX292ZXJsYXAsIi9DbG9uZV9zZXFOX292ZXJsYXBfY29tcGFyaXNvbl90aW1lX3BvaW50c18iLCBkZl9wb3BfdGltZVtbMV1dJHRyZWF0bWVudFsxXSwgIl8iLCBkZl9wb3BfdGltZVtbMV1dJHNvdXJjZVsxXSwgIi5zdmciLCBzZXA9IiIpKQogICAgY2hvcmREaWFncmFtKHNlcWRmLCAKICAgICAgICAgICAgICAgICAjZ3JpZC5jb2wgPSBncmlkLmNvbCwgCiAgICAgICAgICAgICAgICAgc2VsZi5saW5rID0gMSwKICAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3kgPSAwLjMsCiAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblRyYWNrPSJncmlkIiwKICAgICAgICAgICAgICAgICBwcmVBbGxvY2F0ZVRyYWNrcyA9IGxpc3QodHJhY2suaGVpZ2h0ID0gbWF4KHN0cndpZHRoKHVubGlzdChkaW1uYW1lcyhzZXFkZikpKSkpKQogICAgY2lyY29zLnRyYWNrKHRyYWNrLmluZGV4ID0gMSwgcGFuZWwuZnVuID0gZnVuY3Rpb24oeCwgeSkgewogICAgICBjaXJjb3MudGV4dChDRUxMX01FVEEkeGNlbnRlciwgQ0VMTF9NRVRBJHlsaW1bMl0sIENFTExfTUVUQSRzZWN0b3IuaW5kZXgsCiAgICAgICAgICAgICAgICAgIGFkaiA9IGMoMCwgMC41KSkKICAgIH0sIGJnLmJvcmRlciA9IE5BKQogICAgdGl0bGUocGFzdGUoIkNMT05FIFNFUSBOVU0gT1ZFUkxBUCIsIGRmX3BvcF90aW1lW1sxXV0kdHJlYXRtZW50WzFdLCBkZl9wb3BfdGltZVtbMV1dJHNvdXJjZVsxXSksIGNleCA9IDAuOCkKICAgIGNpcmNvcy5jbGVhcigpCiAgICBkZXYub2ZmKCkKICAKICAgIHBuZyhmaWxlbmFtZSA9IHBhc3RlKHBhdGRpcl9vdmVybGFwLCAiL0Nsb25lX3NlcU5fb3ZlcmxhcF9jb21wYXJpc29uX3RpbWVfcG9pbnRzXyIsIGRmX3BvcF90aW1lW1sxXV0kdHJlYXRtZW50WzFdLCAiXyIsIGRmX3BvcF90aW1lW1sxXV0kc291cmNlWzFdLCAiLnBuZyIsIHNlcD0iIiksIHdpZHRoPTE1LCBoZWlnaHQ9MTUsIHVuaXRzID0gImNtIiwgcmVzID0gMzAwKQogICAgY2hvcmREaWFncmFtKHNlcWRmLCAKICAgICAgICAgICAgICAgICAjZ3JpZC5jb2wgPSBncmlkLmNvbCwgCiAgICAgICAgICAgICAgICAgc2VsZi5saW5rID0gMSwKICAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3kgPSAwLjMsCiAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblRyYWNrPSJncmlkIiwKICAgICAgICAgICAgICAgICBwcmVBbGxvY2F0ZVRyYWNrcyA9IGxpc3QodHJhY2suaGVpZ2h0ID0gbWF4KHN0cndpZHRoKHVubGlzdChkaW1uYW1lcyhzZXFkZikpKSkpKQogICAgY2lyY29zLnRyYWNrKHRyYWNrLmluZGV4ID0gMSwgcGFuZWwuZnVuID0gZnVuY3Rpb24oeCwgeSkgewogICAgICBjaXJjb3MudGV4dChDRUxMX01FVEEkeGNlbnRlciwgQ0VMTF9NRVRBJHlsaW1bMl0sIENFTExfTUVUQSRzZWN0b3IuaW5kZXgsCiAgICAgICAgICAgICAgICAgIGFkaiA9IGMoMCwgMC41KSkKICAgIH0sIGJnLmJvcmRlciA9IE5BKQogICAgdGl0bGUocGFzdGUoIkNMT05FIFNFUSBOVU0gT1ZFUkxBUCIsIGRmX3BvcF90aW1lW1sxXV0kdHJlYXRtZW50WzFdLCBkZl9wb3BfdGltZVtbMV1dJHNvdXJjZVsxXSksIGNleCA9IDAuOCkKICAgIGNpcmNvcy5jbGVhcigpCiAgICBkZXYub2ZmKCkKICAKICAgICMgCiAgICAjIAogICAgZGZfVFAgPC0gc3BsaXQoZGZfcGF0W1tpXV0sIGRmX3BhdFtbaV1dJGV4dHJhY3RfdGltZSkKICAKICAjIFBsb3RzIHBlciBwYXRpZW50IGFuZCB0aW1lIHBvaW50IC0gb3ZlcmxhcCBwb3B1bGF0aW9ucwogICAgZm9yIChuIGluIGMoMTpsZW5ndGgoZGZfVFApKSkgewogICAgICBkZl9wb3AgPC0gc3BsaXQoZGZfVFBbW25dXSwgZGZfVFBbW25dXSRwb3B1bGF0aW9uKQogICAgICB2ZW5ucGxvdCA8LSB2ZW5uKGxpc3QodW5pcXVlKGRmX3BvcFtbMV1dJGNsb25lX2lkKSwgdW5pcXVlKGRmX3BvcFtbMl1dJGNsb25lX2lkKSwgdW5pcXVlKGRmX3BvcFtbM11dJGNsb25lX2lkKSwgdW5pcXVlKGRmX3BvcFtbNF1dJGNsb25lX2lkKSksIG5hbWVzID0gbmFtZXMoZGZfcG9wKSkKICAgICAgCiAgICAgIGxpc3RJbnB1dCA8LSBsaXN0KGRmX3BvcFtbMV1dJGNsb25lX2lkLCBkZl9wb3BbWzJdXSRjbG9uZV9pZCwgZGZfcG9wW1szXV0kY2xvbmVfaWQsIGRmX3BvcFtbNF1dJGNsb25lX2lkKQogICAgICBuYW1lcyhsaXN0SW5wdXQpIDwtIG5hbWVzKGRmX3BvcCkKICAgICAgY29tYmluIDwtIGRhdGEuZnJhbWUoZnJvbT1jb21iaW5hdGlvbnMoNCwyLG5hbWVzKGRmX3BvcCkscmVwZWF0cy5hbGxvd2VkPUYpWywxXSwgdG89Y29tYmluYXRpb25zKDQsMixuYW1lcyhkZl9wb3ApLHJlcGVhdHMuYWxsb3dlZD1GKVssMl0pCiAgICAgIAogICAgICAjbGlzdElucHV0IDwtIGxpc3QoZGZfcG9wW1sxXV0kY2xvbmVfaWQsIGRmX3BvcFtbMl1dJGNsb25lX2lkLCBkZl9wb3BbWzNdXSRjbG9uZV9pZCwgZGZfcG9wW1s0XV0kY2xvbmVfaWQpCiAgICAgICNuYW1lcyhsaXN0SW5wdXQpIDwtIG5hbWVzKGRmX3BvcCkKICAgICAgCiAgICAgICMgVXBzZXQgcGxvdHMKICAgICAgc3ZnKGZpbGVuYW1lID0gcGFzdGUocGF0ZGlyX292ZXJsYXAsIi9TZXRfcGxvdF8iLCBkZl9wb3BbWzFdXSR0cmVhdG1lbnRbMV0sICJfIixkZl9wb3BbWzFdXSRleHRyYWN0X3RpbWVbMV0sICJfIixkZl9wb3BbWzFdXSRzb3VyY2VbMV0sICIuc3ZnIiwgc2VwPSIiKSkKICAgICAgdXBzZXQoZnJvbUxpc3QobGlzdElucHV0KSwgZ3JvdXAuYnkgPSAic2V0cyIsIG9yZGVyLmJ5PSJmcmVxIiwgcG9pbnQuc2l6ZSA9IDMuNSwgbGluZS5zaXplPTIsIG1haW5iYXIueS5sYWJlbCA9ICJDbG9uZSBpbnRlcnNlY3Rpb25zIiwgc2V0cy54LmxhYmVsID0gIkNsb25lcyBwZXIgcG9wdWxhdGlvbiIpCiAgICAgIGRldi5vZmYoKQogICAgICAKICAgICAgcG5nKGZpbGVuYW1lID0gcGFzdGUocGF0ZGlyX292ZXJsYXAsIi9TZXRfcGxvdF8iLCBkZl9wb3BbWzFdXSR0cmVhdG1lbnRbMV0sICJfIixkZl9wb3BbWzFdXSRleHRyYWN0X3RpbWVbMV0sICJfIixkZl9wb3BbWzFdXSRzb3VyY2VbMV0sICIucG5nIiwgc2VwPSIiKSwgcmVzID0gNjAwLCB3aWR0aCA9IDE1LCBoZWlnaHQ9MTAsIHVuaXRzID0gImNtIikKICAgICAgdXBzZXQoZnJvbUxpc3QobGlzdElucHV0KSwgb3JkZXIuYnk9ImZyZXEiLCBncm91cC5ieSA9ICJzZXRzIiwgcG9pbnQuc2l6ZSA9IDMuNSwgbGluZS5zaXplPTIsIG1haW5iYXIueS5sYWJlbCA9ICJDbG9uZSBpbnRlcnNlY3Rpb25zIiwgc2V0cy54LmxhYmVsID0gIkNsb25lcyBwZXIgcG9wdWxhdGlvbiIpCiAgICAgIGRldi5vZmYoKQogICAgICAKICAgICAgY2xvbmVkZiA8LSBjb21iaW4KICAgICAgc2VxZGYgPC0gY29tYmluCiAgICAgIAogICAgICBsZW5pbnRlcnNlY3RzID0gbnVtZXJpYygwKQogICAgICBzZXFzaW50ZXJzZWN0cyA9IG51bWVyaWMoMCkKICAgICAgZm9yIChqIGluIGMoMTpucm93KGNsb25lZGYpKSl7CiAgICAgICAgaW50ZXIgPC0gaW50ZXJzZWN0KGRmX3BvcFtbd2hpY2goZ3JlcGwocGFzdGUwKCJeIixjbG9uZWRmW2osMV0pLCBuYW1lcyhkZl9wb3ApKSldXSRjbG9uZV9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmX3BvcFtbd2hpY2goZ3JlcGwocGFzdGUwKCJeIixjbG9uZWRmW2osMl0pLCBuYW1lcyhkZl9wb3ApKSldXSRjbG9uZV9pZCkKICAgICAgICAKICAgICAgICBjbG9uZXNfc3Vic2V0IDwtIGNvdW50X2Nsb25lc1t3aGljaChjb3VudF9jbG9uZXMkY2xvbmVfaWQgJWluJSBhcy5jaGFyYWN0ZXIoaW50ZXIpKSxdCiAgICAgICAgCiAgICAgICAgbGVuaW50ZXJzZWN0cyA8LSBjKGxlbmludGVyc2VjdHMsIGxlbmd0aChpbnRlcikpCiAgICAgICAgc2Vxc2ludGVyc2VjdHMgPC0gYyhzZXFzaW50ZXJzZWN0cywgc3VtKGNsb25lc19zdWJzZXQkc2VxX2NvdW50KSkKICAgICAgfQogICAgICAKICAgICAgY2xvbmVkZiR2YWx1ZSA8LSBsZW5pbnRlcnNlY3RzCiAgICAgIHNlcWRmJHZhbHVlIDwtIHNlcXNpbnRlcnNlY3RzCiAgICAgIAogICAgICAKICAgICAgc2VsZl9jb21iIDwtIGRhdGEuZnJhbWUoZnJvbSA9IG5hbWVzKGRmX3BvcCksIHRvID0gbmFtZXMoZGZfcG9wKSkKICAgICAgc2VsZl9jbG9uZWRmIDwtIHNlbGZfY29tYgogICAgICBzZWxmX3NlcWRmPC0gc2VsZl9jb21iCiAgICAgIAogICAgICBsZW5pbnRlcnNlY3RzIDwtIG51bWVyaWMoMCkKICAgICAgc2Vxc2ludGVyc2VjdHMgPC0gbnVtZXJpYygwKQogICAgICBmb3IgKHBvcCBpbiBzZWxmX2NvbWIkZnJvbSl7CiAgICAgICAgaW50ZXIgPC0gYXR0cmlidXRlcyh2ZW5ucGxvdClbWyJpbnRlcnNlY3Rpb25zIl1dW1twb3BdXQogICAgICAgIGNsb25lc19zdWJzZXQgPC0gY291bnRfY2xvbmVzW3doaWNoKGNvdW50X2Nsb25lcyRjbG9uZV9pZCAlaW4lIGFzLmNoYXJhY3RlcihpbnRlcikpLF0KICAgICAgICAKICAgICAgICBsZW5pbnRlcnNlY3RzIDwtIGMobGVuaW50ZXJzZWN0cywgbGVuZ3RoKGludGVyKSkKICAgICAgICBzZXFzaW50ZXJzZWN0cyA8LSBjKHNlcXNpbnRlcnNlY3RzLCBzdW0oY2xvbmVzX3N1YnNldCRzZXFfY291bnQpKQogICAgICB9CiAgICAgIHNlbGZfY2xvbmVkZiR2YWx1ZSA8LSBsZW5pbnRlcnNlY3RzCiAgICAgIHNlbGZfc2VxZGYkdmFsdWUgPC0gc2Vxc2ludGVyc2VjdHMKICAgICAgCiAgICAgIGNsb25lZGYgPC0gcmJpbmQoY2xvbmVkZiwgc2VsZl9jbG9uZWRmKQogICAgICBzZXFkZiA8LSByYmluZChzZXFkZiwgc2VsZl9zZXFkZikKICAgICAgCiAgICAgIHdyaXRlLnRhYmxlKGNsb25lZGYsIGZpbGUgPSBwYXN0ZShwYXRkaXJfb3ZlcmxhcCwiL0Nsb25lX292ZXJsYXBfY29tcGFyaXNvbl9wb3B1bGF0aW9uXyIsIGRmX3BvcFtbMV1dJHRyZWF0bWVudFsxXSwgIl8iLCBkZl9wb3BbWzFdXSRleHRyYWN0X3RpbWVbMV0sICJfIiwgZGZfcG9wW1sxXV0kc291cmNlWzFdLCAiLnRzdiIsIHNlcD0iIiksIHNlcCA9ICJcdCIsIHF1b3RlID0gRiwgcm93Lm5hbWVzID0gRikKICAgICAgd3JpdGUudGFibGUoc2VxZGYsIGZpbGUgPSBwYXN0ZShwYXRkaXJfb3ZlcmxhcCwiL0Nsb25lX3NlcU5fb3ZlcmxhcF9jb21wYXJpc29uX3BvcHVsYXRpb25fIiwgZGZfcG9wW1sxXV0kdHJlYXRtZW50WzFdLCAiXyIsIGRmX3BvcFtbMV1dJGV4dHJhY3RfdGltZVsxXSwgIl8iLCBkZl9wb3BbWzFdXSRzb3VyY2VbMV0sICIudHN2Iiwgc2VwPSIiKSwgc2VwID0gIlx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQogICAgICAKICAgICAgZ3JpZC5jb2wgPSBjKCIjMjI1ZWE4IiwiIzQxYjZjNCIsIiNhMWRhYjQiLCIjZmZmZmNjIikKICAgICAgCiAgICAgIAogICAgICAjIFBsb3RzIGNsb25lIG92ZXJsYXAKICAgICAgc3ZnKGZpbGVuYW1lID0gcGFzdGUocGF0ZGlyX292ZXJsYXAsIi9DbG9uZV9vdmVybGFwX2NvbXBhcmlzb25fcG9wdWxhdGlvbl8iLCBkZl9wb3BbWzFdXSR0cmVhdG1lbnRbMV0sICJfIiwgZGZfcG9wW1sxXV0kZXh0cmFjdF90aW1lWzFdLCAiXyIsIGRmX3BvcFtbMV1dJHNvdXJjZVsxXSwgIi5zdmciLCBzZXA9IiIpKQogICAgICBjaG9yZERpYWdyYW0oY2xvbmVkZiwgCiAgICAgICAgICAgICAgICAgICAjZ3JpZC5jb2wgPSBncmlkLmNvbCwgCiAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmsgPSAxLAogICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbmN5ID0gMC4zLAogICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblRyYWNrPSJncmlkIiwKICAgICAgICAgICAgICAgICAgIHByZUFsbG9jYXRlVHJhY2tzID0gbGlzdCh0cmFjay5oZWlnaHQgPSBtYXgoc3Ryd2lkdGgodW5saXN0KGRpbW5hbWVzKGNsb25lZGYpKSkpKSkKICAgICAgY2lyY29zLnRyYWNrKHRyYWNrLmluZGV4ID0gMSwgcGFuZWwuZnVuID0gZnVuY3Rpb24oeCwgeSkgewogICAgICAgICAgICAgICAgICAgIGNpcmNvcy50ZXh0KENFTExfTUVUQSR4Y2VudGVyLCBDRUxMX01FVEEkeWxpbVsyXSwgQ0VMTF9NRVRBJHNlY3Rvci5pbmRleCwKICAgICAgICAgICAgICAgICAgICBhZGogPSBjKDAsIDAuNSkpCiAgICAgICAgICAgICAgICAgICAgfSwgYmcuYm9yZGVyID0gTkEpCiAgICAgIHRpdGxlKHBhc3RlKCJjbG9uZV9pZCBPVkVSTEFQIiwgZGZfcG9wW1sxXV0kdHJlYXRtZW50WzFdLCBkZl9wb3BbWzFdXSRzb3VyY2VbMV0sIGRmX3BvcFtbMV1dJGV4dHJhY3RfdGltZVsxXSksIGNleCA9IDAuOCkKICAgICAgY2lyY29zLmNsZWFyKCkKICAgICAgZGV2Lm9mZigpCiAgICAgIAogICAgICBwbmcoZmlsZW5hbWUgPSBwYXN0ZShwYXRkaXJfb3ZlcmxhcCwiL0Nsb25lX292ZXJsYXBfY29tcGFyaXNvbl9wb3B1bGF0aW9uXyIsIGRmX3BvcFtbMV1dJHRyZWF0bWVudFsxXSwgIl8iLCBkZl9wb3BbWzFdXSRleHRyYWN0X3RpbWVbMV0sICJfIiwgZGZfcG9wW1sxXV0kc291cmNlWzFdLCAiLnBuZyIsIHNlcD0iIiksIHJlcyA9IDYwMCwgd2lkdGggPSAxNSwgaGVpZ2h0PTEwLCB1bml0cyA9ICJjbSIpCiAgICAgIGNob3JkRGlhZ3JhbShjbG9uZWRmLCAKICAgICAgICAgICAgICAgICAgICNncmlkLmNvbCA9IGdyaWQuY29sLCAKICAgICAgICAgICAgICAgICAgIHNlbGYubGluayA9IDEsCiAgICAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3kgPSAwLjMsCiAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVHJhY2s9ImdyaWQiLAogICAgICAgICAgICAgICAgICAgcHJlQWxsb2NhdGVUcmFja3MgPSBsaXN0KHRyYWNrLmhlaWdodCA9IG1heChzdHJ3aWR0aCh1bmxpc3QoZGltbmFtZXMoY2xvbmVkZikpKSkpKQogICAgICBjaXJjb3MudHJhY2sodHJhY2suaW5kZXggPSAxLCBwYW5lbC5mdW4gPSBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgY2lyY29zLnRleHQoQ0VMTF9NRVRBJHhjZW50ZXIsIENFTExfTUVUQSR5bGltWzJdLCBDRUxMX01FVEEkc2VjdG9yLmluZGV4LAogICAgICAgICAgICAgICAgICAgIGFkaiA9IGMoMCwgMC41KSkKICAgICAgfSwgYmcuYm9yZGVyID0gTkEpCiAgICAgIHRpdGxlKHBhc3RlKCJjbG9uZV9pZCBPVkVSTEFQIiwgZGZfcG9wW1sxXV0kdHJlYXRtZW50WzFdLCBkZl9wb3BbWzFdXSRzb3VyY2VbMV0sIGRmX3BvcFtbMV1dJGV4dHJhY3RfdGltZVsxXSksIGNleCA9IDAuOCkKICAgICAgY2lyY29zLmNsZWFyKCkKICAgICAgZGV2Lm9mZigpCiAgICAKICAgICAgIyBQbG90cyBjbG9uZSBzZXF1ZW5jZSBudW1iZXJzIG92ZXJsYXAKICAgICAgc3ZnKGZpbGVuYW1lID0gcGFzdGUocGF0ZGlyX292ZXJsYXAsIi9DbG9uZV9zZXFOX292ZXJsYXBfY29tcGFyaXNvbl9wb3B1bGF0aW9uXyIsIGRmX3BvcFtbMV1dJHRyZWF0bWVudFsxXSwgIl8iLCBkZl9wb3BbWzFdXSRleHRyYWN0X3RpbWVbMV0sICJfIiwgZGZfcG9wW1sxXV0kc291cmNlWzFdLCAiLnN2ZyIsIHNlcD0iIikpCiAgICAgIGNob3JkRGlhZ3JhbShzZXFkZiwgCiAgICAgICAgICAgICAgICAgICAjZ3JpZC5jb2wgPSBncmlkLmNvbCwgCiAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmsgPSAxLAogICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbmN5ID0gMC4zLAogICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblRyYWNrPSJncmlkIiwKICAgICAgICAgICAgICAgICAgIHByZUFsbG9jYXRlVHJhY2tzID0gbGlzdCh0cmFjay5oZWlnaHQgPSBtYXgoc3Ryd2lkdGgodW5saXN0KGRpbW5hbWVzKHNlcWRmKSkpKSkpCiAgICAgIGNpcmNvcy50cmFjayh0cmFjay5pbmRleCA9IDEsIHBhbmVsLmZ1biA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICBjaXJjb3MudGV4dChDRUxMX01FVEEkeGNlbnRlciwgQ0VMTF9NRVRBJHlsaW1bMl0sIENFTExfTUVUQSRzZWN0b3IuaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgYWRqID0gYygwLCAwLjUpKQogICAgICB9LCBiZy5ib3JkZXIgPSBOQSkKICAgICAgdGl0bGUocGFzdGUoIkNMT05FIFNFUSBOVU0gT1ZFUkxBUCIsIGRmX3BvcFtbMV1dJHRyZWF0bWVudFsxXSwgZGZfcG9wW1sxXV0kc291cmNlWzFdLCBkZl9wb3BbWzFdXSRleHRyYWN0X3RpbWVbMV0pLCBjZXggPSAwLjgpCiAgICAgIGNpcmNvcy5jbGVhcigpCiAgICAgIGRldi5vZmYoKQogICAgICAKICAgICAgcG5nKGZpbGVuYW1lID0gcGFzdGUocGF0ZGlyX292ZXJsYXAsIi9DbG9uZV9zZXFOX292ZXJsYXBfY29tcGFyaXNvbl9wb3B1bGF0aW9uXyIsIGRmX3BvcFtbMV1dJHRyZWF0bWVudFsxXSwgIl8iLCBkZl9wb3BbWzFdXSRleHRyYWN0X3RpbWVbMV0sICJfIiwgZGZfcG9wW1sxXV0kc291cmNlWzFdLCAiLnBuZyIsIHNlcD0iIiksIHJlcyA9IDYwMCwgd2lkdGggPSAxNSwgaGVpZ2h0PTEwLCB1bml0cyA9ICJjbSIpCiAgICAgIGNob3JkRGlhZ3JhbShzZXFkZiwgCiAgICAgICAgICAgICAgICAgICAjZ3JpZC5jb2wgPSBncmlkLmNvbCwgCiAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmsgPSAxLAogICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbmN5ID0gMC4zLAogICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblRyYWNrPSJncmlkIiwKICAgICAgICAgICAgICAgICAgIHByZUFsbG9jYXRlVHJhY2tzID0gbGlzdCh0cmFjay5oZWlnaHQgPSBtYXgoc3Ryd2lkdGgodW5saXN0KGRpbW5hbWVzKHNlcWRmKSkpKSkpCiAgICAgIGNpcmNvcy50cmFjayh0cmFjay5pbmRleCA9IDEsIHBhbmVsLmZ1biA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICBjaXJjb3MudGV4dChDRUxMX01FVEEkeGNlbnRlciwgQ0VMTF9NRVRBJHlsaW1bMl0sIENFTExfTUVUQSRzZWN0b3IuaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgYWRqID0gYygwLCAwLjUpKQogICAgICB9LCBiZy5ib3JkZXIgPSBOQSkKICAgICAgdGl0bGUocGFzdGUoIkNMT05FIFNFUSBOVU0gT1ZFUkxBUCIsIGRmX3BvcFtbMV1dJHRyZWF0bWVudFsxXSwgZGZfcG9wW1sxXV0kc291cmNlWzFdLCBkZl9wb3BbWzFdXSRleHRyYWN0X3RpbWVbMV0pLCBjZXggPSAwLjgpCiAgICAgIGNpcmNvcy5jbGVhcigpCiAgICAgIGRldi5vZmYoKQogICAgfQojfQoKYGBgCgoKIyBDaXRhdGlvbnMKCklmIHlvdSB1c2UgbmYtY29yZS9iY2VsbG1hZ2ljIGZvciB5b3VyIGFuYWx5c2lzLCBwbGVhc2UgY2l0ZSBpdCB1c2luZyB0aGUgZm9sbG93aW5nIERPSTogWzEwLjUyODEvemVub2RvLjM2MDc0MDhdKGh0dHBzOi8vZG9pLm9yZy8xMC41MjgxL3plbm9kby4zNjA3NDA4KQoKUGxlYXNlIGFsc28gY2l0ZSB0aGUgYG5mLWNvcmVgIHB1YmxpY2F0aW9uIFtAZXdlbHMyMDIwXS4KCkluIGFkZGl0aW9uLCBjaXRhdGlvbnMgZm9yIHRoZSB0b29scyBhbmQgZGF0YSB1c2VkIGluIHRoaXMgcGlwZWxpbmUgYXJlIGFzIGZvbGxvd3M6CgoqICoqcFJFU1RPKiogW0BWYW5kZXJIZWlkZW4yMDE0XQoqICoqU0hhemFNLCBDaGFuZ2UtTyoqIFtAR3VwdGEyMDE1XQoqICoqQWxha2F6YW0qKiBbQFN0ZXJuMjAxNF0KKiAqKlRJZ0dFUioqIFtAR2FkYWxhLU1hcmlhMjAxNV0KKiAqKkZhc3RRQyoqIFtAYW5kcmV3czIwMTBdCiogKipNdWx0aVFDKiogW0Bld2VsczIwMTZdCg==